我在接受采访时被问到这个问题,但我不熟悉SQL。 我希望有人可以帮助我查询,以便我能理解这个概念。
"id" "name" "parentid"
------------------------
"1" "BOSS1" null
"2" "A" "1"
"3" "B" "1"
"4" "C" "3"
"5" "BOSS2" null
"6" "Q" "5"
"7" "T" "6"
所以对于1,它应该打印1,2,3,4
我认为这很简单,但我无法弄清楚如何使用union构建查询...
感谢
答案 0 :(得分:3)
为了比“孩子”更深入,CTE运作良好 -
WITH CTEExample (ID, Name, Parent)
AS
(
SELECT e.ID, e.Name, e.Parent
FROM dbo.ExampleTable e WHERE e.ID = 1
UNION ALL
SELECT e.ID, e.Name, e.Parent
FROM dbo.ExampleTable e
JOIN CTEExample ON e.Parent = CTEExample.ID
)
select ID from CTEExample
这应该返回1,2,3,4。
编辑 - 看起来乔恩打败了我;虽然我认为他的第4行应该是where ID = 1
,而不是where ParentID = 1
希望这有帮助。
答案 1 :(得分:2)
:即1的所有直接后代
select id,name,parentid
where parentid = 1
将返回1,2,3
获取所有子孙后代,如果您使用的是SQL 2005,则可以使用CTE来实现递归:
http://msdn.microsoft.com/en-us/library/ms190766.aspx
WITH Person_CTE AS (
SELECT id,name,parentid
FROM TableName
WHERE ID = 1
UNION ALL
SELECT ChildTable.id,ChildTable.name,ChildTable.parentid
FROM TableName ChildTable
Inner Join Person_CTE on Person_CTE.ID= ChildTable.parentid
)
SELECT * FROM Person_CTE
SQL将递归并将父项加入子项,直到它找不到更多子项返回
当然你可以使用联盟,但这只会返回第一级和第二级(这对你的数据集来说就足够了)
答案 2 :(得分:0)
以下联合声明将按照您的意愿行事,
select id,name,parentid
from table
where parentid = 1
union
select id,name,parentid
from table
where parentid in (select id
from table
where parentid = 1)