我有一个基本的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