【求教】 请问个困难问题。
create table A(aID int identity(1,1),baseid int,[name] varchar(20))
create table B(bID int identity(1,1),parentId int,childId int)
insert A
select 1,'aaa' union all
select 2,'bbb' union all
select 3,'ccc' union all
select 4,'a1' union all
select 5,'a2' union all
select 6,'b1' union all
select 7,'aa1' union all
select 8,'dsdssd'
insert B
select 1,4 union all
select 1,5 union all
select 4,7 union all
select 7,8
--create table A(aID int identity(1,1),baseid int,[name] varchar(20))
--create table B(bID int identity(1,1),parentId int,childId int)
--insert A
--select 1,'aaa' union all
--select 2,'bbb' union all
--select 3,'ccc' union all
--select 4,'a1' union all
--select 5,'a2' union all
--select 6,'b1' union all
--select 7,'aa1' union all
--select 8,'dsdssd'
--insert B
--select 1,4 union all
--select 1,5 union all
--select 4,7 union all
--select 7,8
WITH cte
AS ( SELECT parentId ,
childId ,
1 [LEVEL] --定义级别为顶层
FROM b
WHERE parentid = 1
UNION ALL
SELECT b.parentid ,
b.childId ,
a.[level] + 1 --计算B中的个个级别
FROM cte a
INNER JOIN B ON B.parentid = a.childId
)
--SELECT * FROM cte --这步可以看到CTE的运行结果
SELECT DISTINCT
parentid baseid
FROM cte
WHERE [LEVEL] IN ( 1, 2 ) --选择parentid列中级别为1、2的数据
UNION
SELECT DISTINCT
childId baseid
FROM cte
WHERE [LEVEL] IN ( 1 ) --选择childid列中级别为1的数据,由于为2 的时候会把7也引出来
UNION
--筛选在A中但不在B中的数据
SELECT *
FROM ( SELECT baseid
FROM A
WHERE baseid NOT IN ( SELECT parentId
FROM B
UNION
SELECT childId
FROM b )
) b
/*
baseid
-----------
1
2
3
4
5
6
(6 行受影响)
*/
希望显示结果1,2,3,4,5,6 顺序无所谓/
[其他解释]
想用cte来写 但是没有写出来.
[其他解释]
B表的数据是不是不全啊?cte可以啊,纯操作B表就够了.有需要再关联A表
[其他解释]
--create table A(aID int identity(1,1),baseid int,[name] varchar(20))
--create table B(bID int identity(1,1),parentId int,childId int)
--insert A
--select 1,'aaa' union all
--select 2,'bbb' union all
--select 3,'ccc' union all
--select 4,'a1' union all
--select 5,'a2' union all
--select 6,'b1' union all
--select 7,'aa1' union all
--select 8,'dsdssd'
--insert B
--select 1,4 union all
--select 1,5 union all
--select 4,7 union all
--select 7,8
WITH cte AS
(
SELECT parentId ,childId,1 [LEVEL]
FROM b
WHERE parentid=1
UNION ALL
SELECT b.parentid,b.childId,a.[level]+1
FROM cte a INNER JOIN B ON B.parentid=a.childId
)
--SELECT * FROM cte --把这里取消注销可以看到CTE的结果
--/*
SELECT DISTINCT parentid baseid FROM cte WHERE [LEVEL] IN (1 ,2)
UNION
select DISTINCT childId baseid FROM cte WHERE [LEVEL] IN (1 ) --由于要过滤第三层,所以这里只查询1
UNION
SELECT * FROM (
SELECT baseid
FROM A
WHERE baseid NOT IN (
SELECT parentId
FROM B
UNION
SELECT childId
FROM b
) )b
/*
baseid
-----------
1
2
3
4
5
6
(6 行受影响)
*/
[其他解释]