父子在同一个表

父子在同一个表

问题描述:

我有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

假设的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除非在指定方式就像你看到的在我的查询中。

试试这个...

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

我想下面的查询可以工作。我没有测试过它。

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 

基本上,我在做什么做的是选择父母信息,并将其与每个元组。

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

这是一个简单的方法:

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