查询显示父节点下面的所有子节点
问题如下:
例如:
A B
-----------
A1 B1
A1 B2
B2 BB21
B2 BB22
B21 BBB1
需要得到的结果是
A B
------------
A1 B1
A1 B2
A1 BB21
A1 BB22
A1 BBB1
B2 BB21
B2 BB22
B2 BBB1
B21 BBB1
--环境
CREATE TABLE _t (A varchar(10), B varchar(10))
insert into _t select 'A1','B1'
UNION ALL SELECT 'A1','B2'
UNION ALL SELECT 'B2','B21'
UNION ALL SELECT 'B2','BB22'
UNION ALL SELECT 'B21','BBB1'
--函数
CREATE FUNCTION F_GET(@A VARCHAR(10))
RETURNS @T TABLE(A VARCHAR(10), B VARCHAR(10),LEVEL INT)
AS
BEGIN
WITH F_TABLE(A,B,LVL)
AS
(
SELECT A,B,0 FROM _T
WHERE A=@A
UNION ALL
SELECT A.A,A.B,B.LVL+1
FROM _T A,F_TABLE B WHERE A.A=B.B
)
INSERT INTO @T
SELECT * FROM F_TABLE
RETURN
END

--查询
SELECT DISTINCT D.A,B.B FROM _t D
CROSS APPLY DBO.F_GET(D.A) B
--结果
/*
A B
---------- ----------
A1 B1
A1 B2
A1 B21
A1 BB22
A1 BBB1
B2 B21
B2 BB22
B2 BBB1
B21 BBB1

(9 行受影响)

*/
解决方法二
select A, B from Table
UNION
select P.A A, C.B B from Table P, Table C
where P.B = C.A
例如:
A B
-----------
A1 B1
A1 B2
B2 BB21
B2 BB22
B21 BBB1
需要得到的结果是
A B
------------
A1 B1
A1 B2
A1 BB21
A1 BB22
A1 BBB1
B2 BB21
B2 BB22
B2 BBB1
B21 BBB1
--环境
CREATE TABLE _t (A varchar(10), B varchar(10))
insert into _t select 'A1','B1'
UNION ALL SELECT 'A1','B2'
UNION ALL SELECT 'B2','B21'
UNION ALL SELECT 'B2','BB22'
UNION ALL SELECT 'B21','BBB1'
--函数
CREATE FUNCTION F_GET(@A VARCHAR(10))
RETURNS @T TABLE(A VARCHAR(10), B VARCHAR(10),LEVEL INT)
AS
BEGIN
WITH F_TABLE(A,B,LVL)
AS
(
SELECT A,B,0 FROM _T
WHERE A=@A
UNION ALL
SELECT A.A,A.B,B.LVL+1
FROM _T A,F_TABLE B WHERE A.A=B.B
)
INSERT INTO @T
SELECT * FROM F_TABLE
RETURN
END
--查询
SELECT DISTINCT D.A,B.B FROM _t D
CROSS APPLY DBO.F_GET(D.A) B
--结果
/*
A B
---------- ----------
A1 B1
A1 B2
A1 B21
A1 BB22
A1 BBB1
B2 B21
B2 BB22
B2 BBB1
B21 BBB1
(9 行受影响)
*/
解决方法二
select A, B from Table
UNION
select P.A A, C.B B from Table P, Table C
where P.B = C.A

浙公网安备 33010602011771号