Begrenzte T-SQL-Mitglied werden
-
06-07-2019 - |
Frage
Dies sollte einfach genug sein, aber irgendwie mein Gehirn aufgehört zu arbeiten.
Ich habe zwei verknüpften Tabellen:
Tabelle 1:
ID (PK), Value1
Tabelle 2:
BatchID, Table1ID (FK to Table 1 ID), Value2
Beispieldaten:
Tabelle 1:
ID Value1
1 A
2 B
Tabelle 2:
BatchID Table1ID Value2
1 1 100
2 1 101
3 1 102
1 2 200
2 2 201
Nun, für jeden Datensatz in der Tabelle 1, würde Ich mag einen passenden Datensatz auf Tabelle 2, zu tun, sondern nur die jüngsten (Batch-ID ist sequentiell). Ergebnis für das obige Beispiel wäre:
Table1.ID Table1.Value1 Table2.Value2
1 A 102
2 B 201
Das Problem ist einfach, wie Ergebnis mit Table2 begrenzen verbinden. Es gab ähnliche Fragen auf SO, kann aber nichts wie meine finden. Hier ist eine auf MySQL, die ähnlich aussieht: Begrenzen einer SQL JOIN
Ich bin zu jedem Ansatz offen, obwohl Geschwindigkeit der Hauptpriorität ist immer noch da es eine große Datenmenge sein wird.
Lösung
WITH Latest AS (
SELECT Table1ID
,MAX(BatchID) AS BatchID
FROM Table2
GROUP BY Table1ID
)
SELECT *
FROM Table1
INNER JOIN Latest
ON Latest.Table1ID = Table1.ID
INNER JOIN Table2
ON Table2.BatchID = Latest.BatchID
Andere Tipps
SELECT id, value1, value2
FROM (
SELECT t1.id, t2.value1, t2.value2, ROW_NUMBER() OVER (PARTITION BY t1.id ORDER BY t2.BatchID DESC) AS rn
FROM table1 t1
JOIN table2 t2
ON t2.table1id = t1.id
) q
WHERE rn = 1
Versuchen
select t1.*,t2.Value2
from(
select Table1ID,max(Value2) as Value2
from [Table 2]
group by Table1ID) t2
join [Table 1] t1 on t2.Table1ID = t1.id
So oder GROUP BY oder WHERE-Klausel, die auf dem neuesten Filter:
SELECT * FROM Table1 a
INNER JOIN Table2 b ON (a.id = b.Table1ID)
WHERE NOT EXISTS(
SELECT 1 FROM Table2 c WHERE c.Table1ID = a.id AND c.BatchID > b. BatchID
)