2009-06-22 12 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