aktualisieren Sie Tabelle nach Wert in einer anderen Tabelle, die mehrere datasätze enthält

Ich habe einige ähnliche Fragen mit Update-Tabelle nach Wert auf einer anderen Tabelle gesehen.

Aber wenn T2 mehrere datasätze mit der gleichen Hilfe hält und auch nur datasätze in T1 aktualisieren, die Status = O haben?

T1 aid = 2345|Status = O aid = 2120|Status = B T2 aid = 2345|Status=B|Date=23/12/2002 aid = 2345|Status=F|Date=11/05/2002 aid = 2345|Status=G|Date=4/04/2002 aid = 2345|Status=R|Date=12/03/2002 aid = 2120|Status=G|Date=4/04/2012 aid = 2120|Status=R|Date=12/03/2005 

Beispiel:

  UPDATE T1 SET T1.Status = T2.Status Where T1.aid = (T2.aid of the record that holds newest date or max date) AND = T1.Status = 'O' 

Nun, für SQL server 2005+ können Sie Folgendes tun:

AKTUALISIERT

 ;WITH CTE AS ( SELECT *, RN = ROW_NUMBER() OVER(PARTITION BY aid ORDER BY [Date] DESC) FROM Table2 ) UPDATE T1 SET T1.Status = T2.Status FROM Table1 T1 INNER JOIN CTE T2 ON T1.aid = T2.aid WHERE T2.RN = 1 AND T1.Status = 'O' -- for your "updated" question 

Und ein anderer path wäre:

 UPDATE T1 SET T1.Status = COALESCE( ( SELECT TOP (1) T2.Status FROM T2 WHERE T2.aid = T1.aid ORDER BY [Date] DESC ), T1.Status) FROM T1 WHERE T1.Status = 'O' ; 

In der Regel verwenden Sie eine JOIN zu UPDATE aus mehreren Tabellen und dann können Sie MAX und JOIN Tabelle 2 auf sich selbst verwenden:

 UPDATE a SET a.Status = b.Status FROM T1 a JOIN T2 b ON a.aid = b.aid JOIN ( SELECT aid, MAX(date) maxdate FROM T2 GROUP BY aid ) c ON b.aid = c.aid AND b.date = c.maxdate