我有一个表(mytable),如下例所示,包含任何集合的项目:
CollCode | ItemCode
---------+---------
101 | 201
101 | 202
101 | 203
202 | 204
202 | 205
我想从这张表中找回一个像这样的结果:
CollCode | ItemCode
---------+----------
101 | 201
101 | 202
101 | 203
101 | 204
101 | 205
202 | 204
202 | 205
这意味着我想要所有级别的集合中的所有项目而不仅仅是第一级别。
答案 0 :(得分:3)
您正在寻找递归CTE。试试这个:
with t(CollCode, ItemCode) as (
values (101, 201), (101, 202), (101, 203),
(202, 204), (202, 205)
),
cte as (
select t.CollCode, t.ItemCode
from t
union all
select cte.CollCode, t.ItemCode
from cte join
t
on t.collCode = cte.ItemCode
)
select *
from cte
order by collCode;
(显然,CTE t
只是提供样本数据来证明这是有效的。)
编辑:
删除中间结果:
select *
from cte
where not exists (select 1 from t t2 where t2.collCode = cte.ItemCode)
order by collCode;