我有一个基本的SQL表,每行之间有一个简单的继承关系。那是每行都有一个ParentID,并使用它与另一行连接。其如下

AccountID  |  AccountName  |  ParentID
---------------------------------------
    1            Mathew        0
    2            Philip        1
    3            John          2
    4            Susan         2
    5            Anita         1
    6            Aimy          1
    7            Elsa          3
    8            Anna          7
    .............................
.................................
    45           Kristoff      8

希望结构清晰

但是我要求列出这些有点奇怪。那就是当我们传递一个AccountID时,它应该列出其所有 parent , sibling 和 sibling 的 child 。但是,它永远不会列出该AccountID的任何子级。我可以通过图片更详细地说明这一点。对不起,图片清晰。我的是一个旧的电话摄像头。

当我们传递AccountID 4 时,它应列出所有Parents及其 sibling ,但不应列出4,6,7,8,9,10 。这意味着应避免在结果中使用该帐户及其任何子帐户(基于图片树元素)。希望解释清楚。

最佳答案

如果我做对了,您需要输出除4及其所有后代之外的整个表,请尝试以下递归查询:

WITH CT AS
(
  SELECT * FROM T WHERE AccountID=4
  UNION ALL
  SELECT T.* FROM T
     JOIN CT ON T.ParentID = CT.AccountId
)
SELECT * FROM T WHERE AccountID
                NOT IN (SELECT AccountID FROM CT)

SQLFiddle demo

回答评论中的问题:



您应该从ID = 2开始,然后移至最底端的ID = 4,以便在ID = 4之后剪切整个子树:
WITH CT AS
(
  SELECT * FROM T WHERE AccountID=2
  UNION ALL
  SELECT T.* FROM T
     JOIN CT ON T.ParentID = CT.AccountId
  WHERE T.AccountId<>4
)

SELECT * FROM CT

10-06 09:03
查看更多