【发布时间】:2018-12-21 09:17:22
【问题描述】:
我需要在 SQL Server 中使用递归,但我不知道如何在我的层次结构树中使用它。
我需要一些帮助来创建我的查询并了解 CTE 递归是否可行。
我的例子:
我有两个表:piece (piece_id) 和piece_equivalence(piece1_id, piece2_id)
首先,我需要从第一个表中获取所有部分:
SELECT DISTINCT p.record_id FROM piece p
其次,我需要检查该片段是否存在于第二个表中(piece1_id 或piece2_id)
SELECT DISTINCT p.record_id
FROM piece p
inner join piece_equivalence pe
ON (pe.piece1_id = p.record_id OR pe.piece2_id = p.record_id)
第三,如果该片存在,我需要检查piece1_id或piece2_id。此 ID 也可以具有等价性。 所以我也会用我的piece1_id或piece2_id检查第二步。
目前我使用参数piece1或piece2递归调用相同的函数。
带节点的图形视图:
piece_id
___/ \___
/ \
table : piece_equivalence piece1_id or piece2_id piece1_id or piece2_id
/ \ / \
table : piece_equivalence piece1_id or piece2_id same same same
带有字母的图形:
A
___/ \___ ________
/ \ \
B C D
/ \ / \ / \
D E F B E G
/ /
G H
A : 一块 B、C、D、E、F、G、H 是等价的。
警告:我需要在临时表中存储所有的等价物。为了避免重复输入或无限循环,我们必须检查这个临时表的数据是否存在。
编辑:
我这样做了:
WITH pieces_CTE
AS
(
SELECT TOP 1 p.record_id as parent,
case when pe.piece1_id <> p.record_id then pe.piece1_id else pe.piece2_id end as enfant,
1 as level
FROM piece p
inner join piece_equivalence pe ON (pe.piece1_id = p.record_id OR pe.piece2_id = p.record_id) AND pe.pertinence = 100
AND pe.piece1_id <> pe.piece2_id
UNION ALL
SELECT c.parent, case when enfant.piece1_id <> c.parent then enfant.piece1_id else enfant.piece2_id end as enfant,
c.level+1
from pieces_CTE c
INNER JOIN piece_equivalence enfant ON (enfant.piece1_id = c.parent OR enfant.piece2_id = c.parent)
WHERE enfant.pertinence = 100
)
SELECT * from pieces_CTE ORDER BY parent,level,enfant
OPTION (MAXRECURSION 32767)
语句终止。最大递归100已用完 在语句完成之前。
但我的记录很大,而且我的查询记录很多,我认为不可能使用具有许多冗余循环的 CTE...
但为什么我与 TOP 1 有同样的错误?
【问题讨论】:
标签: sql-server tree common-table-expression recursive-query