是的,你可以做到這一點using a recursive CTE。
在查詢的每個迭代中,您都可以附加層次結構名稱的新級別。
在互聯網上有很多這種技術的例子。
例如,與該樣本數據:
CREATE TABLE Test
(id INT,
parent_id INT null,
NAME VARCHAR(50)
)
INSERT INTO Test VALUES(1, NULL, 'L1')
INSERT INTO Test VALUES(2, 1, 'L1-A')
INSERT INTO Test VALUES(3, 2, 'L1-A-1')
INSERT INTO Test VALUES(4, 2, 'L1-A-2')
INSERT INTO Test VALUES(5, 1, 'L1-B')
INSERT INTO Test VALUES(6, 5, 'L1-B-1')
INSERT INTO Test VALUES(7, 5, 'L1-B-2')
可以編寫一個遞歸CTE這樣的:
WITH H AS
(
-- Anchor: the first level of the hierarchy
SELECT id, parent_id, name, CAST(name AS NVARCHAR(300)) AS path
FROM Test
WHERE parent_id IS NULL
UNION ALL
-- Recursive: join the original table to the anchor, and combine data from both
SELECT T.id, T.parent_id, T.name, CAST(H.path + '\' + T.name AS NVARCHAR(300))
FROM Test T INNER JOIN H ON T.parent_id = H.id
)
-- You can query H as if it was a normal table or View
SELECT * FROM H
WHERE PATH = 'L1\L1-A' -- for example to see if this exists
的查詢的結果(沒有其中過濾器)看起來像這樣:
1 NULL L1 L1
2 1 L1-A L1\L1-A
5 1 L1-B L1\L1-B
6 5 L1-B-1 L1\L1-B\L1-B-1
7 5 L1-B-2 L1\L1-B\L1-B-2
3 2 L1-A-1 L1\L1-A\L1-A-1
4 2 L1-A-2 L1\L1-A\L1-A-2
從您的示例和標籤看來,您已經知道答案 - 將其存儲在'hierarchyid'中,而我們e'ToString'將每個節點轉換爲一個字符串路徑,然後進行比較。您可能需要首先插入臨時表 – 2014-09-23 08:38:37
我擁有的路徑列是ToString()表示。我需要能夠構建扁平化樹形路徑。我目前不知道如何獲得Faltned Tree Path – 2014-09-23 09:10:40