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,我有一张像这样的桌子: 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 E F 如

我有一张像这样的桌子:

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
E
F
如果我选择oName=B,那么结果应该是:

oName
A
B
C
D
E
F
G
oName
B
E
F

如何在SQL上执行此操作?

您可以使用递归的
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
或者,如果
设置@name='B'
,则输出为

oName
B
E
F

您可以使用递归的
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
或者,如果
设置@name='B'
,则输出为

oName
B
E
F

@Haminteu不用担心-我很高兴能帮上忙。@Haminteu不用担心-我很高兴能帮上忙。