2009-06-22 42 views
4

這應該很簡單,但不知何故,我的大腦停止工作。有限的T-SQL加入

我有兩個相關的表:

表1:

ID (PK), Value1 

表2:

BatchID, Table1ID (FK to Table 1 ID), Value2 

實施例的數據:

表1:

ID Value1 
1 A 
2 B 

表2:

BatchID Table1ID Value2 
1  1   100 
2  1   101 
3  1   102 
1  2   200 
2  2   201 

現在,表1中的每個記錄,我想要做的表2匹配的記錄,但只有最近的一個(批ID是連續的)。結果對於上面的例子是:

Table1.ID Table1.Value1 Table2.Value2 
1   A    102 
2   B    201 

問題很簡單,如何限制與表2加入的結果。 SO上也有類似的問題,但是找不到像我這樣的東西。這裏有一個看起來類似的MySQL: LIMITing an SQL JOIN

我接受任何方法,雖然速度仍然是主要優先事項,因爲它將是一個大數據集。

+0

的SQL Server版本? – AakashM 2009-06-22 14:08:53

回答

10
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 
-1

無論GROUP BY或WHERE子句中,關於最近的過濾器:

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

問題是,「最近的」對於每條記錄可能會有所不同,因此您無法爲整個表格批量編號。 – 2009-06-22 14:08:25

+0

-1,因爲它只是一個通用的答案。另外,你可以看到純粹的GROUP BY/WHERE在這裏不起作用。你需要一個CTE,就像Cade所做的一樣,或者一個子查詢。 – Eric 2009-06-22 14:10:21

+0

我正在添加一個例子。同意我應該更清楚地說明子查詢是「過濾最近的WHERE子句」。 – 2009-06-22 14:12:47

3
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 
0

嘗試

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