2014-09-23 136 views
0

我正在使用SQL層次結構數據類型爲我的應用程序中的分類結構建模。 分類法可以在不同的水平在SQL Server層次結構中展平樹形路徑ID

enter image description here

在該數據需要經由excel工作表要上載的設置具有相同的名稱。

在插入任何節點之前,我想檢查特定路徑上的節點是否已經存在,這樣我就不會複製這些條目。 檢查節點@特定絕對路徑是否已存在的最簡單方法是什麼?

爲如之前插入說,「零售」,「銀行2」我應該可以查下「/銀行2 /零售」是不存在的

有什麼辦法來提供整個樹的扁平表示結構,以便我可以檢查絕對路徑,然後繼續?

enter image description here

+0

從您的示例和標籤看來,您已經知道答案 - 將其存儲在'hierarchyid'中,而我們e'ToString'將每個節點轉換爲一個字符串路徑,然後進行比較。您可能需要首先插入臨時表 – 2014-09-23 08:38:37

+0

我擁有的路徑列是ToString()表示。我需要能夠構建扁平化樹形路徑。我目前不知道如何獲得Faltned Tree Path – 2014-09-23 09:10:40

回答

5

是的,你可以做到這一點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