干得好:
with g (rootid, previd, level, keyid, col1, col2, col3) as (
select keyid, '-', 1, keyid, col1, col2, col3 from item
union all
select g.rootid, g.keyid, g.level + 1, i.keyid, i.col1, i.col2, i.col3
from g
join item i on i.col1 = g.col1 or i.col2 = g.col2 or i.col3 = g.col3
where i.keyid > g.keyid
),
m (keyid, rootid) as (
select keyid, min(rootid) from g group by keyid
)
select * from m;
结果:
keyid rootid
----- ------
a a
b a
c a
d a
e a
f a
g g
h g
:请记住,默认情况下,sql Server在处理递归CTE时限制为100次迭代(每个组的行数)。 :即使可以如上所述进行操作,sqlServer可以处理的内容也有明显的限制。如果达到此限制,您将收到以下消息:
在语句完成之前,最大递归100已用尽。
如果发生这种情况,请考虑添加子句option (maxrecursion 32767)
。