子查询中的唯一记录

时间:2011-04-21 19:14:29

标签: sql sql-server-2008

我有一个SQL表,将与两个子表连接。其中一个子表是简单连接,但另一个子表将具有一个或多个记录,这些记录对应于父表中的一个记录。我需要编写一个查询,它将返回父表中的每条记录,并且只返回父表中每条相关记录的最新记录。

所以,例如:

父表

PARENTID
ParentName
用户名
ParentBlahBlah

SubTable1

用户名
用户名
用户组
UserCreated

SubTable2

子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选择一行而不是一行。

我至少在正确的轨道上?

3 个答案:

答案 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))