[英]SQL Query to extract nesting from a table
我有一張表,其中引用是從一行到另一行的。 所以基本上是這樣的:
ID | Name | ParentId
1 | Root |
2 | Top |
3 | Sub1 | 1
4 | Sub2 | 2
第三列[ParentId]表示當前行的父級。 我的問題是如何使用SQL查詢從表中獲取此嵌套。 我想從查詢中看到的結果是
ID | Name | ParentName
1 | Root | NULL
2 | Top | NULL
3 | Sub1 | Root
4 | Sub2 | Top
似乎微不足道,因為它只是用項目名稱替換了第三列的ID,但我似乎無法弄清楚。 感謝您的幫助!
對於單個級別,您可以在同一表上使用左聯接
select a.id, a.name, b.name
from my_table a
left join my_table b on b.parentId = a.id
select t1.id, t1.name, t2.name as parentName
from table t1
left join table t2
on t2.id = t1.parentId
以下查詢將幫助您實現目標:
SELECT
t1.Id,
t1.Name,
(SELECT t2.Name FROM MyTable t2 WHERE t2.Id = t1.ParentId) ParentName
FROM
MyTable t1
如果表中有很多記錄,則通過在ParentId
列上創建索引,可以比JOIN
更快地運行上述查詢。
SQL小提琴: hierarchyid示例小提琴
我決定采用一種稍微不同的方法來回答這個問題,使用SQL Server本身支持的hierarchyid
數據類型。 hierarchyid
創建專門負責處理記錄選擇/嵌套關系的查詢功能,一旦你習慣了一些(附帶的數據類型,如嵌入式查詢/這往往需要以價值為實際的ID到達子查詢未成年人的煩惱記錄),它實際上非常漂亮。
我創建了一個SQL小提琴,逐步顯示了如何將數據類型用於以下示例的嵌套關系:
/Category One
/Subcategory 1
/Subcategory 1.1
/Subcategory 1.2
/Subcategory 1.3
/Subcategory 2
/Subcategory 3
/Subcategory 3.1
/Subcategory 3.1.1
/Subcategory 4
/Category Two
/Subcategory 1
注意:tsql已被重寫並帶有注釋的MSDN示例代碼,而實際上這在imo中是很差的。 我以某種方式重寫並介紹了它,使我發現將頭纏繞起來要容易得多。
所有建議的解決方案都可以很好地解決發布的問題。 在我的“實際”情況下,該表要復雜得多,並且已經有許多APPLY語句(我想是特定的SQL Server),所以我最終使用了發布的Join語句的“外部應用”變體: With a AS ( SELECT id, name from Nesting )
SELECT id, name, ParentName from a OUTER APPLY ( SELECT name as ParentName from Nesting n where n.parentid = a.id
) AS FOOWith a AS ( SELECT id, name from Nesting )
SELECT id, name, ParentName from a OUTER APPLY ( SELECT name as ParentName from Nesting n where n.parentid = a.id
) AS FOO
非常感謝大家!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.