4

私は2つのテーブルを持っています:

       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 の最新の日付に基づいて、名前が重複する行を除外して、2 つのテーブルを結合したいと考えています。たとえば、左内部結合を使用してテーブル A と B を結合すると、J. Smith (表 B の行 1 と 4 に基づく)。日付が古いもの (表 B の行 1) を除外したいと思います。

これどうやってするの?

編集:

テーブル B のすべての列を含める必要があります。

4

4 に答える 4

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
于 2012-04-17T09:17:01.423 に答える
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
于 2012-04-17T09:23:14.007 に答える
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)に対してのみ最高の日付を通過させることにより、リミッターとして機能します。また、BLimitを使用する場合にのみ制限が発生するため、Bのすべてのフィールドをクエリに使用できます。

于 2012-04-17T11:46:29.743 に答える
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
于 2012-04-17T09:13:45.623 に答える