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

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

 (9 行受影响)
(9 行受影响)

 */
*/
 
解决方法二
 select A, B from Table
select A, B from Table
 UNION
UNION
 select P.A A, C.B B from Table P, Table C
select P.A A, C.B B from Table P, Table C
 where P.B = C.A
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))
CREATE TABLE _t (A varchar(10), B varchar(10)) insert into _t select 'A1','B1'
insert into _t select 'A1','B1' UNION ALL SELECT 'A1','B2'
UNION ALL SELECT 'A1','B2' UNION ALL SELECT 'B2','B21'
UNION ALL SELECT 'B2','B21' UNION ALL SELECT 'B2','BB22'
UNION ALL SELECT 'B2','BB22' UNION ALL SELECT 'B21','BBB1'
UNION ALL SELECT 'B21','BBB1' --函数
--函数 CREATE FUNCTION F_GET(@A VARCHAR(10))
CREATE FUNCTION F_GET(@A VARCHAR(10)) RETURNS @T TABLE(A VARCHAR(10), B VARCHAR(10),LEVEL INT)
RETURNS @T TABLE(A VARCHAR(10), B VARCHAR(10),LEVEL INT) AS
AS BEGIN
BEGIN WITH F_TABLE(A,B,LVL)
WITH F_TABLE(A,B,LVL) AS
AS (
( SELECT A,B,0 FROM _T
SELECT A,B,0 FROM _T WHERE A=@A
WHERE A=@A UNION ALL
UNION ALL SELECT A.A,A.B,B.LVL+1
SELECT A.A,A.B,B.LVL+1 FROM _T A,F_TABLE B WHERE A.A=B.B
FROM _T A,F_TABLE B WHERE A.A=B.B )
) INSERT INTO @T
INSERT INTO @T SELECT   * FROM F_TABLE
SELECT   * FROM F_TABLE RETURN
RETURN END
END
 --查询
--查询 SELECT DISTINCT D.A,B.B FROM _t D
SELECT DISTINCT D.A,B.B FROM _t D CROSS APPLY DBO.F_GET(D.A) B
CROSS APPLY DBO.F_GET(D.A) B --结果
--结果 /*
/* A          B
A          B ---------- ----------
---------- ---------- A1         B1
A1         B1 A1         B2
A1         B2 A1         B21
A1         B21 A1         BB22
A1         BB22 A1         BBB1
A1         BBB1 B2         B21
B2         B21 B2         BB22
B2         BB22 B2         BBB1
B2         BBB1 B21        BBB1
B21        BBB1
 (9 行受影响)
(9 行受影响)
 */
*/
解决方法二
 select A, B from Table
select A, B from Table UNION
UNION select P.A A, C.B B from Table P, Table C
select P.A A, C.B B from Table P, Table C where P.B = C.A
where P.B = C.A
 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号