2012-04-17 81 views
3

我有兩個表:SQL服務器 - 連接兩個表基於最近的日期

 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.最近的日期ommiting重名行例如,如果我使用左內連接將表A和B連接在一起,則將爲J. Smith獲取兩行(基於表B中的第1行和第4行)。我想排除舊日期(表B中的第1行)。

我該怎麼做?

編輯:

我需要包括從表B中的所有列

+0

什麼版本的sql服務器? – Arion 2012-04-17 09:09:59

+0

使用SQL Server 2008 – user559142 2012-04-17 09:12:47

+1

'10/03/01'是什麼日期? '2010日至01'? 'OCT-03-2001'? '10日至2001'? '10日至1901'? – 2012-04-17 09:57:37

回答

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

好吧,這似乎工作,但如果表B有其他列,我想包括在我的SQL語句中不需要在分區? – user559142 2012-04-17 09:25:25

+0

您可以通過按日期排序來完成分區,並獲取所有ID,然後從表B中獲取所需的所有數據,之後您可以與表A進行連接。 – Zyku 2012-04-17 09:28:46

+0

實際上,表B中有許多其他列(舉例來說)。如何在select語句中包含非分區列 – user559142 2012-04-17 09:49:04

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

一個缺點是,如果您需要來自B的任何其他數據,它必須進入CTE或B需要鏈接到SELECT語句此外。肯定適用於所問的問題。 – KMB 2012-04-17 11:48:15

0

尼斯使用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只允許最高日來僅通過對每個無(FK)作爲限制器。並且B中的所有字段都可以用於查詢,因爲僅在使用BLimit時B發生了限制。