2016-07-07 2 views
5

に基づいて従業員のタイトルを更新する私は2つのテーブルを持っているSQL直近の位置

select * from #Table1 
+------------+-------+---------------------+ 
| EMPLOYEEID | Name | Title    | 
+--------------------+---------------------+ 
| 1   | Tom | System Admin  | 
| 2   | Bill | Server Admin  | 
| 3   | John | Senior Server Admin | 
| 4   | Bob | IT Staff   | 
| 5   | Jill | Senior IT Staff  | 
+--------------------+---------------------+ 

表2

CREATE TABLE #Table2(
    EMPLOYEEnumber [nvarchar] (100) NULL, 
    Name [nvarchar] (100) NULL, 
    positiontitle [nvarchar] (100) NULL, 
    datepositionstart [date] NOT NULL) 

    INSERT INTO #Table2 (EMPLOYEEnumber, Name, positiontitle, datepositionstart) VALUES ('1','Tom','System Admin', '2014-07-03'), ('1','Tom','Server Admin', '2014-08-13'), ('1','Tom','Senior Server Admin', '2016-07-23'), ('2', 'Bob', 'IT Staff', '2014-07-03') , ('2', 'Bob', 'Senior IT Staff', '2016-10-15') 

それは私を与える:

select * from #Table2 
    +----------------+-------+---------------------+-----------------+ 
    | EMPLOYEEnumber | Name | positiontitle  |datepositionstart| 
    +----------------+-------+--------------------+-----------------+ 
    | 1    | Tom | System Admin  | 2014-07-03  | 
    | 2    | Tom | Server Admin  | 2014-08-13  | 
    | 3    | Tom | Senior Server Admin | 2016-07-23  | 
    | 4    | Bob | IT Staff   | 2014-07-03  | 
    | 4    | Bob | Senior IT Staff  | 2016-10-15  | 
    +------------------------+---------------------+-----------------+ 

テーブル2の最新の位置に基づいてテーブル1の従業員のタイトルを更新するにはどうすればよいですか?

以下のコードは最新の日付を取得しません。代わりに、同じdatepositionstartを持つTable2の従業員の重複を取得します。

UPDATE Table1 
    SET E.TITLE = hre.[PositionTitle] 
    FROM Table1 E 
    JOIN Table2 hre on hre.EmployeeNumber = E.EMPLOYEEID 
    WHERE 
     E.Name = hre.Name 
     AND datepositionstart = 
      (SELECT MAX(datepositionstart) 
       FROM table2 hre 
       WHERE hre.EmployeeNumber = E.EMPLOYEEID) 

期待される結果:

+------------+-------+---------------------+ 
| EMPLOYEEID | Name | Title    | 
+--------------------+---------------------+ 
| 1   | Tom | Senior Server Admin | 
| 2   | Bill | Server Admin  | 
| 3   | John | Senior Server Admin | 
| 4   | Bob | Senior IT Staff  | 
| 5   | Jill | Senior IT Staff  | 
+--------------------+---------------------+ 
+0

私はすべてのSQLの質問は次のようにフォーマットされた希望!あなたはそれのために私のupvoteを獲得しました。 –

+0

はい、テーブル2のデータが間違っているようです... –

+1

いいえ、しないでください。代わりにビューを作成します。 (または、おそらく、計算列を持っています。)しかし、なぜ同じデータを2回保存すると、データの不一致の危険がありますか? – jarlh

答えて

4

使用row_number()を希望し、これを試してみてください:

update 
    set title = t2.positiontitle 
from table1 t1 join 
    (select t2.*, row_number() over (partition by employeenumber order by datepositionstart desc) as seqnum 
     from table2 t2 
    ) t2 
    on t1.employeeid = t2.employeenumber and seqnum = 1; 
2

このような何かを試してみてください。

Update T1 Set T1.Title = T2.PositionTitle 
FROM Table1 T1 
JOIN 
(
    SELECT EmployeeNumber,PositionTitle, Max(datepositionstart) AS datepositionstart 
    FROM Table2 group by EmployeeNumber,PositionTitle 
) T2 
on T1.EMPLOYEEID = T2.EmployeeNumber 
2
UPDATE e 

SET E.TITLE = t.[PositionTitle] 

FROM #Table1 e 
JOIN #Table2 t ON t.EMPLOYEEnumber= e.EMPLOYEEID 
WHERE t.datepositionstart = 
      (SELECT MAX(datepositionstart) 
       FROM #table2 hre 
       WHERE hre.EmployeeNumber = E.EMPLOYEEID 
       GROUP BY hre.EMPLOYEEnumber) 

私が作った仮定はtable2.EMPLOYEEnumbertable1.EMPLOYEEIDを参照する外部キーであるということです。

表2に初期の挿入は、次のように作成されるため、期待されるデータは、達成されていません。

EMPLOYEEnumber Name positiontitle  datepositionstart 
1    Tom  System Admin  2014-07-03 
1    Tom  Server Admin  2014-08-13 
1    Tom  Senior Server Admin 2016-07-23 
2    Bob  IT Staff   2014-07-03 
2    Bob  Senior IT Staff  2016-10-15 

人々が及びません彼らを変えることができるように私は、テーブルに特に履歴テーブルを結合する手段として名前を使用していないだろう時間の経過とともに名前が変わる。

2

各従業員のために最新のタイトルを決定するために、これはあなたの助け、

Update T1 Set T1.Title = d.PositionTitle 
    FROM #Table1 T1 
    JOIN 
    (
     select EMPLOYEEnumber,positiontitle,datepositionstart 
     ,ROW_NUMBER() over (PARTITION BY EMPLOYEEnumber order by datepositionstart desc) rn 
     from #Table2 
    ) d 
    on T1.EMPLOYEEID = d.EmployeeNumber and d.rn = 1 
関連する問題