2016-07-07 105 views
5

Ho 2 tabelle:SQL - Aggiornamento dei dipendenti titolo basato sulla più recente posizione

Tabella 1

CREATE TABLE #Table1(
    EMPLOYEEID [nvarchar] (100) NULL, 
    Name [nvarchar] (100) NULL, 
    TITLE [nvarchar] (100) NULL) 

    INSERT INTO #Table1 (EMPLOYEEID, Name, TITLE) VALUES ('1','Tom','System Admin'), ('2','Bill','Server Admin'), ('3','John','Senior Server Admin'), ('4', 'Bob', 'IT Staff') , ('5', 'Jill', 'Senior IT Staff') 

che mi dà:

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

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

Il che mi dà:

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

Come aggiornare il titolo del dipendente di tabella1 in base alla posizione più recente nella tabella 2?

Il codice seguente non ottiene la data più recente, invece ricevo duplicati di dipendenti da Table2 con lo stesso datepositionstart.

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) 

Risultati attesi:

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

Auguro a tutte le domande SQL è stata formattati come questo! hai guadagnato il mio upvote solo per quello. –

+0

Sì, i dati in tabella2 sembrano errati ... –

+1

No, non farlo. Crea invece una vista. (Oppure, forse, avere una colonna calcolata.) Ma perché memorizzare gli stessi dati due volte, rischiando l'incoerenza dei dati? – jarlh

risposta

4

Usa row_number() per determinare il titolo più recente per ogni dipendente:.

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

provare qualcosa di simile.

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) 

L'ipotesi che ho fatto è che table2.EMPLOYEEnumber è una chiave esterna che fa riferimento table1.EMPLOYEEID.

I dati previsto non è stato raggiunto, perché l'inserto iniziale in table2 crea la seguente:

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 

Non vorrei usare nomi come mezzo per unire le tabelle specialmente tabelle di cronologia, come le persone possono e cambiare la loro nomi nel tempo.

2

Prova questo, spero che questo ti aiuta,

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