我有两张桌子:
A
---------------
No. Name
1 J.Smith
2 R.Alan
3. D.Williams
B
----------------------------
ID. Date Address No.(FK from table A)
1 10/03/01 blah blah 1
2 08/02/05 blah blah 2
3. 12/01/02 blah blah 3
4. 03/07/11 blah blah 1
5. 30/03/09 blah blah 2
我想连接这两个表,一起根据表B中最近的日期省略具有重复名称的行。例如,如果我使用左内连接将表A和B连接在一起,我将为J获得两行史密斯(基于表B中的第1行和第4行)。我想排除那个日期较旧的日期(表B中的第1行)。
我该怎么做?
编辑:
我需要包含表B中的所有列。
答案 0 :(得分:1)
也许是这样的:
;WITH CTE
AS
(
SELECT
ROW_NUMBER() OVER(PARTITION BY tblB.[No] ORDER BY tblB.[Date]) AS RowNbr,
tblB.*
FROM
B AS tblB
)
SELECT
*
FROM
A AS tblA
LEFT JOIN CTE
ON tblA.No=CTE.No
AND CTE.RowNbr=1
答案 1 :(得分:1)
WITH [max_dates] AS (
SELECT [No], MAX([Date]) AS [Date]
FROM [TableB]
GROUP BY [No]
)
SELECT [a].[Name], [b].[Date]
FROM [TableA] AS [a]
JOIN [max_dates] AS [b] ON ([a].[No] = [b].[No])
ORDER BY [a].[No] ASC
答案 2 :(得分:0)
SELECT A.No
, A.Name
, C.Date
, C.Address
, C. ...
FROM A
LEFT JOIN
( SELECT Address , ... , No, Date, ROW_NUMBER() OVER(PARTITION BY No ORDER BY Date DESC) AS row
FROM B
) C ON A.No = C.No
WHERE C.row = 1
WHERE COALESCE(C.row, 1) = 1 [if there is no link ,and you'll get Date NULL]
编辑:如果B中有很多列
SELECT A.No
, A.Name
, C.* (also row)
FROM A
LEFT JOIN
( SELECT * , ROW_NUMBER() OVER(PARTITION BY No ORDER BY Date DESC) AS row
FROM B
) C ON A.No = C.No
WHERE C.row = 1
答案 3 :(得分:0)
很好地使用了Rory Hunter的CTE,或者没有它:
SELECT [A].Name, [B].Date
FROM [A]
INNER JOIN [B]
INNER JOIN
( -- build a limitation on B
SELECT No, MaxDate = Max(Date)
FROM [B]
GROUP BY No
) BLimit
ON BLimit.No = B.No
AND BLimit.MaxDate = B.Date
ON B.No = A.No
BLimit仅限每个No(FK)允许最高日期通过限制器。并且B中的所有字段都可以用于查询,因为限制仅在B上使用BLimit。