簡體   English   中英

SQL查詢從表中提取嵌套

[英]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 FOO
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 FOO

非常感謝大家!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM