2016-04-06 20 views
0

私は雇用者と従業員のデータの記録を保持するテーブルを持っています。このSQL Server:最新のエントリでレコードを更新するクエリ

ような何か
EmployerName EmployerPhone EmployerAddress EmployeeName EmployeePhone EmployeeAddress Date 
------------------------------------------------------------------------------------------------------- 
John    12345  NewYork   Harry  59786   NewYork  12-1-1991 
Mac    22345  Bankok   John   12345   Delhi   12-3-1991 
Smith    54732  Arab   Amar   59226   China   21-6-1991 
Sarah    12345  Bhutan   Mac   22345   NewYork  5-9-1991 
Root    85674  NewYork   Smith  54732   Japan   2-11-1991 

私はphone number(雇用主と従業員の両方)に基づいて、一般的な記録を持っています別のテーブルを持っています。私がしました。この

Phone Name Address 
----------------------- 
59786 Harry NewYork 
22345 Mac NewYork 
59226 Amar China 
12345 Sarah Bhutan 
22345 Mac NewYork 
85674 Root NewYork 
54732 Smith Arab 

同様

Phone Name Address 

次私はphoneに基づいてTable2Table1から最新の記録にaccording to dateを入れたいと表構造が..です

多くのクエリを書いたが、必要に応じて誰かが見つかりませんでした。

何か助けていただければ幸いです。電話重複せずにテーブルを初期化するために

+1

「最新」を定義してください。 – Raj

+0

は日付欄 –

+0

に従って最新の/最新のエントリを意味します。その2番目のテーブルの代わりにビューを作成します。 (または列を計算しました) – jarlh

答えて

1

INSERT IGNORE INTO Table2 (Phone, Name, Address) 
     SELECT X.* FROM (
      SELECT EmployeeName,EmployeePhone,EmployeeAddress FROM Table1    
      UNION 
      SELECT EmployerName,EmployerPhone,EmployerAddress FROM Table1 
      ) X 
      WHERE NOT EXISTS (SELECT Phone FROM Table2 WHERE Phone=X.Phone) 
+0

いいえ、いずれもプライマリキーです。 –

+0

電話機が一意の場合は、このフィールドに一意のインデックスを付けます。それ以外の場合は、挿入と更新の2つのクエリを行う必要があります – Plebios

+0

私は2つのクエリでも大丈夫です。唯一の一度だけの活動だからです。 –

1

私は、これは私が正しくあなたの質問を理解していれば、あなたが探しているものだと思います。一度だけ働かなければならない

DECLARE @restbl TABLE 
(
    Name   varchar(100), 
    Phone   varchar(20), 
    Addr   varchar(100), 
    [Date]   date, 
    RecType   varchar(100) 
) 
INSERT INTO @restbl 
SELECT EmployerName, EmployerPhone, NULL, MAX([Date]), 'Employer' 
FROM @tbl 
GROUP BY EmployerName, EmployerPhone 

INSERT INTO @restbl 
SELECT EmployeeName, EmployeePhone, NULL, MAX([Date]), 'Employee' 
FROM @tbl 
GROUP BY EmployeeName, EmployeePhone; 

WITH LatestData (Name, Phone, [Date]) 
     AS 
     (
      SELECT Name, Phone, MAX([Date]) 
      FROM @restbl 
      GROUP BY Name, Phone 
     ) 
INSERT INTO FinalTable (Name, Phone, [Address]) 
SELECT DISTINCT ld.Name, ld.Phone, ISNULL(tEmployer.EmployerAddress, tEmployee.EmployeeAddress) AS [Address] 
FROM LatestData ld 
     LEFT JOIN @tbl tEmployer ON ld.Name = tEmployer.EmployerName AND ld.Phone = tEmployer.EmployerPhone AND ld.Date = tEmployer.Date 
     LEFT JOIN @tbl tEmployee ON ld.Name = tEmployee.EmployeeName AND ld.Phone = tEmployee.EmployeePhone AND ld.Date = tEmployee.Date 
+0

を私の必要に近いところで選択します。 –

関連する問題