使用外部加入的ID加入视图

时间:2016-02-18 09:25:26

标签: sql sql-server sql-server-2008 select join

我正在与SQL Server合作,我在加入一些表时遇到了困难。

以下是该方案:

我有以下表格:

  • 系统
  • 转移

有关表格的更多信息:

  • 每个区域可以有多个系统,但系统只能在一个区域内。
  • 系统可以有多个传输,但传输元组只能与一个系统关联。

我可以通常的方式加入SystemArea,但对于转移表,我想检索特定数据,然后加入System和{{1 }}

这是我的查询

Area

上述问题是,我希望在SELECT System.*, Transferring.SomeAttribute FROM System INNER JOIN Area ON Area.ID = System.AreaID INNER JOIN ( SELECT TOP 1 SomeAttribute, SystemID FROM Transfer WHERE Transfer.SystemID = {System ID ?} ORDER BY Transfer.Date DESC ) Transferring ON Transferring.SystemID = System.ID WHERE Area.ID = @AreaID 视图中按Transferring进行过滤,并仅返回SystemID

如果我从TOP 1中移除WHERE条款并且只保留加号上的view将返回错误的数据,因为SystemID = System.ID将首先发生,然后{ {1}}。

另一方面,我想在一个TOP 1语句中实现它,我不想使用两个不同的查询。

只是为了清楚上述查询中我想要的内容:
我想获取区域中所有系统的信息,每个系统的SystemID = System.ID,但最新的系统SELECT表将包含每个系统的多个传输。

1 个答案:

答案 0 :(得分:1)

您可以使用row_number()窗口函数查找每个系统的最新传输,然后过滤掉这些行:

SELECT
    System.*,
    Transferring.SomeAttribute 
FROM
    System 
INNER JOIN
    Area ON Area.ID = System.AreaID
INNER JOIN (
    SELECT 
        SomeAttribute,
        SystemID,
        ROW_NUMBER() OVER (PARTITION BY SystemID ORDER BY Date DESC) AS rn
    FROM
        Transfer
    ) Transferring ON Transferring.SystemID = System.ID AND rn = 1
WHERE
    Area.ID = @AreaID