我正在与SQL Server
合作,我在加入一些表时遇到了困难。
以下是该方案:
我有以下表格:
有关表格的更多信息:
我可以通常的方式加入System
和Area
,但对于转移表,我想检索特定数据,然后加入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
表将包含每个系统的多个传输。
答案 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