Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.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 子查询中的唯一记录_Sql_Sql Server 2008 - Fatal编程技术网

Sql 子查询中的唯一记录

Sql 子查询中的唯一记录,sql,sql-server-2008,Sql,Sql Server 2008,我有一个SQL表,它将与两个子表连接。其中一个子表是简单联接,但另一个子表将具有一条或多条与父表中的一条记录相对应的记录。我需要编写一个查询,返回父表中的每条记录,并且只返回父表中每个相关记录的最新记录 例如: 父表 ParentID 父名称 用户ID 布拉布拉赫 子表1 用户ID 用户名 用户组 用户创建 子表2 SubID ParentID 子名称 苏布拉布拉赫 我的问题是: SELECT * FROM ParentTable INNER JOIN SubTable1 ON Pa

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

例如:

父表 ParentID
父名称
用户ID
布拉布拉赫

子表1 用户ID
用户名
用户组
用户创建

子表2 SubID
ParentID
子名称
苏布拉布拉赫

我的问题是:

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


我至少在这方面是正确的吗?

一种方法是使用
交叉应用

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  

一种方法是使用
交叉应用

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  
试试这个:

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
试试这个:

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

在第二个内部连接中,而不是

(SELECT TOP 1 * FROM SubTable2)
使用


在第二个内部连接中,而不是

(SELECT TOP 1 * FROM SubTable2)
使用


我还应该在子查询中添加按日期排序DESC!我还应该在子查询中添加按日期排序DESC!假设后来定义的
子ID
的日期更晚。没错。。我想我不能用这个,因为那样。我的部分应用程序将做插入,通常这将是真实的。。。但是其他人正在开发它的另一部分,不幸的是,我不能保证他们的数据将如何运行。假设以后定义的
SubId
具有更晚的日期。没错。。我想我不能用这个,因为那样。我的部分应用程序将做插入,通常这将是真实的。。。但其他人正在开发它的另一部分,不幸的是,我不能保证他们的数据将如何运行。这是真的-我不知道交叉应用!你有cross apply文档的链接吗?@Johan-但这有-我不知道cross apply!你有交叉申请文档的链接吗?@Johan-但是