Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server-基于最新日期连接两个表_Sql_Sql Server_Database_Sql Server 2008 - Fatal编程技术网

SQL Server-基于最新日期连接两个表

SQL Server-基于最新日期连接两个表,sql,sql-server,database,sql-server-2008,Sql,Sql Server,Database,Sql Server 2008,我有两张桌子: 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.

我有两张桌子:

       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.Smith获得两行(基于表B中的行1和行4)。我想排除日期较旧的(表B中的第1行)

我该怎么做

编辑:

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

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

也许是这样的:

;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

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。

好,这似乎是可行的,但是如果表B中有我想包含在sql语句中的其他列,而这些列在分区中是不需要的呢?您可以不按日期排序地进行分区,并获取所有ID,通过这些ID可以获得所需的所有数据从表B和之后,您可以与表A进行连接,因为表B有许多其他列(例如地址)。如何在select语句中包含非分区列日期
10/03/01
<代码>2010-3-01<代码>2001年10月3日<代码>2001年3月10日<代码>1901年3月10日?一个缺点是,如果您需要B提供的任何其他数据,它必须进入CTE,或者B还需要链接到SELECT语句。当然,对于所提出的问题是有效的。
 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