父子在同一个表
我有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查询?请帮帮我。
假设的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
如果你需要去两/三/四/ etc等级,该怎么办? – 2010-11-07 04:05:17
如果OP要求那么怎么办? ;-) – 2010-11-07 04:09:06
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
是对的parentID在同一个表引用ID列? – Eric 2010-11-07 03:55:20
@kirkamal,你能标记答案中的一个吗? – Eric 2015-10-17 23:55:32