Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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_Sql Server 2012 - Fatal编程技术网

SQL:如何查找叶行?

SQL:如何查找叶行?,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,我有一个自相关的表myTable,如: ID | RefID ---------- 1 | NULL 2 | 1 3 | 2 4 | NULL 5 | 2 6 | 5 7 | 5 8 | NULL 9 | 7 我需要得到任何深度的叶行 根据上表,结果必须为: ID | RefID ---------- 3 | 2 4 | NULL 6 | 5 8 | NULL 9 | 7 多谢各位 PS:深度可能会有所不同,这里是一个很小的例子 试试: 试试这个: SELECT

我有一个自相关的表myTable,如:

ID | RefID
----------
 1 | NULL
 2 | 1
 3 | 2
 4 | NULL
 5 | 2
 6 | 5
 7 | 5
 8 | NULL
 9 | 7
我需要得到任何深度的叶行

根据上表,结果必须为:

ID | RefID
----------
 3 | 2
 4 | NULL
 6 | 5
 8 | NULL
 9 | 7
多谢各位

PS:深度可能会有所不同,这里是一个很小的例子

试试:

试试这个:

SELECT *
FROM
     my_table
WHERE
     id NOT IN
     (
      SELECT DISTINCT
         refId
      FROM
         my_table
      WHERE
         refId IS NOT NULL
      )

你的意思是“层次结构的最低级别”?是的,英语不是我的母语请更新示例数据以显示深度可能不同时的结果。目前你只要求我们解决最简单的案件。如果你还想解决这个复杂的问题,那就展示出来吧@AaronBertrand我认为示例表包含所有的变体,即一行没有子行(ID=4),另一行有子行,它有自己的子行(1->2->3)。我将尝试添加更多的行以使其更清晰。这不会涉及深层次的层次结构。您可以提供一个反例吗?我不知道什么是行不通的。请用更多的数据查看我的答案。我不同意。唯一的编辑是分页。无论如何,很高兴看到这个答案是正确的,我担心我错过了什么。我必须在X.L.Ant和@paul之间选择答案。我选择X.L.Ant是因为实际的执行计划给了我更好的结果!谢谢你,X.L.Ant这不会涉及深层次的层次。请看其他答案的评论:这取决于对如此简单的事情的描述。您只需要检查每个行的子行是否有自己的子行。其他两个答案很好——即使使用了您的样本数据。然而,这个CTE缺少第7,5行?@NenadZivkovic:你是对的,它太复杂了。如果层次结构分支,则使用密集的_秩。另外,它是根中每个分支的最低叶子,还是每个根的最低叶子?@ypercube:你能告诉我为什么吗?@X.L.Ant我收回了我之前的评论。更正:如果要查找作为特定项的后代的所有叶节点,则需要递归。在这种情况下它不是必需的,因为OP似乎想要结构的所有叶子。@感谢您的具体说明。这与所选答案非常相似。
存在
方法更可取。非常感谢。
select  ID, RefId
from    myTable t1 left join myTable t2 on t1.ID = t2.RefID
where   t2.RefID is null
DECLARE @t TABLE (id int NOT NULL, RefID int NULL);

INSERT @t VALUES (1, NULL), (2, 1),  (3, 2),  (5, NULL), 
             (6, 5), (4, NULL), (7, 5), (8, NULL), (9, 8), (10, 7);

WITH CTE AS
(
    -- top level
    SELECT id, RefID, id AS RootId, 0 AS CTELevel FROM @t WHERE REfID IS NULL
    UNION ALL
    SELECT T.id, T.RefID, RootId, CTELevel + 1 FROM @t T JOIN CTE ON T.RefID = CTE.id
), Leafs AS
(
    SELECT
        id, RefID, DENSE_RANK() OVER (PARTITION BY CTE.RootId ORDER BY CTELevel DESC) AS Rn
    FROM CTE
)
SELECT
    id, RefID
FROM
    Leafs
WHERE
    rn = 1
SELECT *
FROM
     my_table
WHERE
     id NOT IN
     (
      SELECT DISTINCT
         refId
      FROM
         my_table
      WHERE
         refId IS NOT NULL
      )