我有一個表可以引用表中的另一個成員作爲父項。該父母也可以將另一行作爲其父母......等等。父子鏈的SQL查詢
id col1 col2 parentID
1 foo bar NULL
2 blah boo 1
3 fob far 2
4 wob lob NULL
我想返回鏈給定一個id。所以如果id是3,我會返回第3行,第2行和第1行。如果id是2,我會返回第2行和第1行。如果id是1或4,我會返回該行。
謝謝
我有一個表可以引用表中的另一個成員作爲父項。該父母也可以將另一行作爲其父母......等等。父子鏈的SQL查詢
id col1 col2 parentID
1 foo bar NULL
2 blah boo 1
3 fob far 2
4 wob lob NULL
我想返回鏈給定一個id。所以如果id是3,我會返回第3行,第2行和第1行。如果id是2,我會返回第2行和第1行。如果id是1或4,我會返回該行。
謝謝
DECLARE @id INT
SET @id = 3
;WITH hierarchy AS (
SELECT t.id, t.parentid
FROM YOUR_TABLE t
WHERE t.id = @id
UNION ALL
SELECT x.id, x.parentid
FROM YOUR_TABLE x
JOIN hierarchy h ON h.parentid = x.id)
SELECT h.id
FROM hierarchy h
結果:
id
---
3
2
1
在這裏你去
SELECT P.cat_id AS parent_cat_id, P.parent_id AS ROOT, P.cat_name AS parent_cat_name, C.parent_id, C.cat_id, C.cat_name FROM categories AS P LEFT OUTER JOIN categories AS C ON C.parent_id=P.cat_id WHERE P.parent_id IS NULL ORDER BY parent_cat_name, cat_name
如果使用遞歸CTE,不忘記添加
h.parentid <> x.id
上
您的加入
JOIN hierarchy h ON h.parentid = x.id)
否則你將只是一個最大遞歸 - 錯誤,因爲它循環
WITH Hierarchy(ChildId, ChildName, Generation, ParentId)
AS
(
SELECT Id, Name, 0, ParentId
FROM UserType AS FirtGeneration
WHERE ParentId IS NULL
UNION ALL
SELECT NextGeneration.Id, NextGeneration.Name, Parent.Generation + 1, Parent.ChildId
FROM UserType AS NextGeneration
INNER JOIN Hierarchy AS Parent ON NextGeneration.ParentId = Parent.ChildId
)
SELECT *
FROM Hierarchy
OPTION(MAXRECURSION 32767)
請不要只發布代碼,添加說明。 PS:請學習如何在SO上正確格式化代碼;我這次修復了它。 – 2017-06-04 09:08:16
其koool :),這樣一個漂亮的查詢,但我認爲它是爲三個層次的層次? – 2013-11-25 14:04:43