sql父子表面试问题

时间:2011-07-26 23:06:04

标签: sql database

我在接受采访时被问到这个问题,但我不熟悉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. 鉴于id,找到所有孩子
  2. 所以对于1,它应该打印1,2,3,4

    我认为这很简单,但我无法弄清楚如何使用union构建查询...

    感谢

3 个答案:

答案 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)