2016-07-07 53 views
5

dayalı Çalışan Başlık Güncellenmesi ben 2 tablolarSQL en son Pozisyon

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  | 
+--------------------+---------------------+ 

Tablo 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') 

Hangisi bana verir:

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  | 
    +------------------------+---------------------+-----------------+ 

Tablo1'de en son konuma göre tablo1 çalışanı başlığını nasıl güncelleştiririm?

Aşağıdaki kod, en son tarihi almaz; bunun yerine, aynı datepositionstart ile Tablo 2'deki çalışanların çoğaltmasını alırım.

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) 

Beklenen Sonuçlar:

+------------+-------+---------------------+ 
| 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

Bütün sql soruları böyle biçimlendirilmiştir diliyorum! Bunun için sadece kazancımı kazandın. –

+0

Evet, tablo2'deki verileriniz yanlış görünüyor ... –

+1

Hayır, yapma. Bunun yerine bir görünüm oluşturun. (Ya da, belki, hesaplanmış bir sütun var.) Ama neden aynı verileri iki kez saklamak, veri tutarsızlığını riske atmak? – jarlh

cevap

4

kullanın row_number() Umut bu deneyin:

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

Böyle bir şey deneyin.

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) 

yaptığım varsayım table2.EMPLOYEEnumbertable1.EMPLOYEEID başvuran yabancı anahtar olmasıdır. tablo2 içine ilk parçada aşağıdaki oluşturduğundan

beklenen veriler elde değildir:

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 

insanlar ve değiştiririm gibi ben, masalar özellikle geçmiş tablolar birleştirme aracı olarak isimlerini kullanmak ister onların zamanla isimler. .

2

her bir çalışan için en son başlığını belirlemek için, bu yardımcı olur,

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