我有一个SQL表,将与两个子表连接。其中一个子表是简单连接,但另一个子表将具有一个或多个记录,这些记录对应于父表中的一个记录。我需要编写一个查询,它将返回父表中的每条记录,并且只返回父表中每条相关记录的最新记录。
所以,例如:
PARENTID
ParentName
用户名
ParentBlahBlah
用户名
用户名
用户组
UserCreated
子ID
PARENTID
SUBNAME
SubBlahBlah
我现在的查询是这样的:
SELECT * FROM ParentTable
INNER JOIN SubTable1
ON ParentTable.UserID=SubTable1.UserID
INNER JOIN
(SELECT TOP 1 * FROM SubTable2) as Table2
ON ParentTable.ParentID = Table2.ParentID
这就是我被困住的地方。 TOP显然不对,因为它只为每个ParentID选择一行而不是一行。
我至少在正确的轨道上?
答案 0 :(得分:2)
一种方法是使用CROSS APPLY
SELECT *
FROM ParentTable
INNER JOIN SubTable1
ON ParentTable.UserID = SubTable1.UserID
CROSS APPLY (SELECT TOP 1 *
FROM SubTable2
WHERE ParentTable.ParentID = SubTable2.ParentID
ORDER BY [date] DESC) ca
答案 1 :(得分:2)
试试这个:
WITH DAT AS
(
SELECT *,
RANK() OVER(PARTITION BY ParentTable.ParentID ORDER BY ParentID DESC) RN
FROM ParentTable INNER JOIN SubTable1
ON ParentTable.UserID = SubTable1.UserID INNER JOIN SubTable2
ON ParentTable.ParentID = SubTable2.ParentID
)
SELECT *
FROM DAT
WHERE RN = 1
答案 2 :(得分:0)
在你的第二个内连接中而不是
(SELECT TOP 1 * FROM SubTable2)
使用
(Select * from SubTable2 WHERE
SubId in (SELECT MAX(SubId) FROM SubTable2 GROUP BY ParentID))