2010-11-07 59 views
6

我有SQL Server表的結構如下圖所示:父子在同一個表

ID Name  ParentID 
----------------------- 
1  Root  NULL 
2  Business 1 
3  Finance 1 
4  Stock  3 

我想顯示在我的網頁中的細節,如

ID Name  ParentName 
------------------------- 
1  Root  - 
2  Business Root 
3  Finance Root 
4  Stock  Finance  

我如何構建我的SQL查詢?請幫幫我。

+0

是對的parentID在同一個表引用ID列? – Eric 2010-11-07 03:55:20

+0

@kirkamal,你能標記答案中的一個嗎? – Eric 2015-10-17 23:55:32

回答

4

假設的SQL Server 2005+,使用遞歸CTE這樣的:

WITH hierarchy AS (
    SELECT t.id, 
     t.name, 
     t.parentid, 
     CAST(NULL AS VARCHAR(50)) AS parentname 
    FROM YOUR_TABLE t 
    WHERE t.parentid IS NULL 
    UNION ALL 
    SELECT x.id, 
     x.name, 
     x.parentid, 
     y.name 
    FROM YOUR_TABLE x 
    JOIN hierarchy y ON y.id = x.parentid) 
SELECT s.id, 
     s.name, 
     s.parentname 
    FROM hierarchy s 

空的強制類型轉換可能看起來很奇怪,但SQL Server默認的數據類型爲INT除非在指定方式就像你看到的在我的查詢中。

8

試試這個...

SELECT a.ID, a.Name, b.Name AS 'ParentName' 
FROM TABLE AS a LEFT JOIN TABLE AS b on a.ParentID = b.ID 

隨着左連接,查詢也不會發現什麼加入了NULL,爲ParentName列返回空白。

編輯:

如果您不希望「父」欄是空白,但要表現出「 - 」破折號然後使用該查詢。

SELECT a.ID, a.Name, COALESCE(b.Name,'-') AS 'ParentName' 
FROM TABLE AS a LEFT JOIN TABLE AS b on a.ParentID = b.ID 
+0

如果你需要去兩/三/四/ etc等級,該怎麼辦? – 2010-11-07 04:05:17

+0

如果OP要求那麼怎麼辦? ;-) – 2010-11-07 04:09:06

+0

Jus不斷重複加入同一張表 – Eric 2010-11-07 04:11:33

1

我想下面的查詢可以工作。我沒有測試過它。

SELECT 
ID 
, name 
, (CASE WHEN parent_name IS NULL THEN '-' ELSE parent_name END) 
FROM 
RELATIONS 
, (SELECT 
parentID 
, name AS parent_name 
FROM 
RELATION) PARENT 
WHERE 
RELATIONS.parentId = PARENT.parentId 

基本上,我在做什麼做的是選擇父母信息,並將其與每個元組。

3
SELECT CH.ID, CH.NAME, ISNULL(PA.NAME, '-') AS "PARENTNAME" 
FROM TBL CH 
LEFT OUTER JOIN TBL PA 
ON CH.PARENTID = PA.ID 
0

這是一個簡單的方法:

SELECT ID,Name,(SELECT TOP 1 Name FROM Table t WHERE t.ParentID=ParentID) AS ParentName FROM Table 
相關問題