我試圖使用遞歸查詢通過結構化像這樣的表找到一個路徑:公用表表達式檢索路徑
RelatedEntities
FromKey TINYINT
ToKey TINYINT
...more....
我想我可以做類似這:
DECLARE @startKey UNIQUEIDENTIFIER, @endKey UNIQUEIDENTIFIER;
SET @startKey = 0;
SET @endKey = 3;
;With findPath
AS
(
SELECT FromKey, ToKey
FROM RelatedEntities
WHERE FromKey = @startKey
UNION ALL
SELECT FromKey, ToKey
FROM RelatedEntities r
JOIN findPath b
ON r.FromKey = b.ToKey
AND r.FromKey NOT IN (SELECT FromKey FROM b)
)
SELECT * FROM findPath;
此代碼失敗,因爲我不能使用CTE內的子查詢。它似乎也是一個規則,遞歸查詢只能包含一個引用到CTE。 (true?)也許這是一個遊標或程序代碼的工作,但我想我會把它放在這裏以防萬一我找不到通過CTE表的路徑的方法?
的參數是:
- 開始有開始和結束鍵
- 基地查詢使用開始鍵
- 遞歸查詢時,它所包含的結束鍵應該停止,(一直沒能指出一個),並且不應該重複開始鍵。
- MAXRECURSION選項可用於在一定次數的迭代後停止。
感謝你們所有的CTE專家。把我放直。
爲了便於閱讀,將其從UNIQUEIDENTIFIERS更改爲TINYINT。 SQL結構是相同的。這裏有一些代碼來測試它。
CREATE TABLE RelatedEntities(FromKey TINYINT, ToKey TINYINT);
INSERT RelatedEntities(FromKey, ToKey)
VALUES
(1, 0),
(0, 1),
(1, 7),
(7, 1),
(3, 4),
(4, 3)
;With FindPath
AS
(
SELECT FromKey, ToKey, 0 AS recursionLevel
FROM RelatedEntities
WHERE FromKey = 1
UNION ALL
SELECT r.FromKey, r.ToKey, recursionLevel = recursionLevel + 1
FROM RelatedEntities r
INNER JOIN FindPath b ON r.FromKey = b.ToKey
WHERE b.ToKey <> 3 AND RecursionLevel < 10
)
SELECT * FROM FindPath
ORDER BY recursionLevel
請注意,這將從1返回到0,然後從0返回到1,並重復,直到用完遞歸級別。
謝謝,但這並不妨礙查詢重複啓動鍵。 IE,如果我的startkey是@a而我的endkey是@b,但是@a指的是@c,而@c又指向@a,我將永遠不會去@b。這就是爲什麼我在遞歸成員中有NOT IN子句,但TSQL不允許它。我認爲在JOIN條款中我會忽略一些顯而易見的東西,這會允許這樣做,但它迄今爲止已經逃脫了我。 – quest4truth 2015-03-30 20:23:08
@ user3481891您可以發佈一些示例數據以及必要的輸出結果嗎? – 2015-03-30 20:27:58
@ user3481891請注意,遞歸CTE以我試圖在上面描述的方式進行操作,即每個遞歸只應用於先前遞歸級別的結果記錄,而不應用於先前遞歸步驟期間生成的所有記錄的並集。 – 2015-03-30 20:44:44