首页 > 解决方案 > 获取所有子 SQL

问题描述

我有一张像这样的桌子:

oName     oPost    oPoint
A         1        NULL
B         2        1
C         3        1
D         4        1
E         5        2
F         6        2
G         7        3

所以,如果我选择oName = A那么结果应该是:

oName
A
B
C
D
E
F
G

如果我选择oName = B,那么结果应该是:

oName
B
E
F

我怎样才能在 SQL 上做到这一点?

标签: sqlsql-serversql-server-2012

解决方案


您可以使用递归CTE遍历从指定节点开始的层次结构:

DECLARE @name VARCHAR(1);
SET @name = 'A';

WITH CTE AS (
  SELECT oName, oPost
  FROM data
  WHERE oName = @name
  UNION ALL
  SELECT d.oName, d.oPost
  FROM data d
  JOIN CTE ON CTE.oPost = d.oPoint
)
SELECT oName
FROM CTE
ORDER BY oName

输出:

oName
A
B
C
D
E
F
G

或者,如果你SET @name='B',输出是

oName
B
E
F

dbfiddle 上的演示


推荐阅读