sql父子表访谈问题
我在一次采访中被问到这个问题,但我不熟悉SQL。 我希望有人能在这个问题上帮助我,这样我才能理解这个概念sql父子表访谈问题,sql,database,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" 给一个id,找到所有
"id" "name" "parentid"
------------------------
"1" "BOSS1" null
"2" "A" "1"
"3" "B" "1"
"4" "C" "3"
"5" "BOSS2" null
"6" "Q" "5"
"7" "T" "6"
给一个id,找到所有的孩子
所以对于1,它应该打印1,2,3,4
我认为这很容易,但我不知道如何使用union构造查询
谢谢下面的工会声明将满足您的要求
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)
下面的工会声明将满足您的要求
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)
对于单个级别:即1的所有直接后代
select id,name,parentid
where parentid = 1
将返回1,2,3
要获取所有子代和孙辈,以及更高版本,如果您使用的是SQL 2005,则可以使用CTE,它支持递归:
SQL将向下递归,并将父节点连接到子节点上,直到找不到更多的子节点返回
当然,您可以使用联合,但这只会返回第一级和第二级,足以满足数据集对单个级别的要求:即1的所有直接后代
select id,name,parentid
where parentid = 1
将返回1,2,3
要获取所有子代和孙辈,以及更高版本,如果您使用的是SQL 2005,则可以使用CTE,它支持递归:
SQL将向下递归,并将父节点连接到子节点上,直到找不到更多的子节点返回
当然,您可以使用Union,但它只返回第一级和第二级,这足以让您的数据集比child更深入,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
编辑-看起来乔恩在这方面击败了我;虽然我认为他的第四行应该是ID=1,而不是ParentID=1
希望这能有所帮助。要想比孩子更深入,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
编辑-看起来乔恩在这方面击败了我;虽然我认为他的第四行应该是ID=1,而不是ParentID=1
希望这能有所帮助。您缺少标题行,我假设标题行类似于id、名称、父项。\u如果D.N.正确,我认为您不需要使用联合查询。只需从表中选择id,其中parent_id=1在这种情况下也不会是1。我以为你打错了。你怎么能通过给id 1得到1,2,3,4?是的,我刚刚意识到抱歉,已经晚了:P你想要孩子,孙子,等等。因为id 4,父母id是3,但3的父母id是1-我们正在抓取父母和父母的父母。你缺少标题行,我假设是id,name,如果D.N.是正确的,我认为您不需要使用联合查询。只需从表中选择id,其中parent_id=1在这种情况下也不会是1。我以为你打错了。你怎么会期望通过给id 1得到1,2,3,4?对,我刚刚意识到抱歉,已经晚了:P你想要孩子,孙子,等等因为id 4,父id是3,但3的父id是1-我们抓住了父母和父母的父母。我想这可能是…我想没有递归就没有办法进入其他级别了?…是的,我同意这一点。关于递归,我喜欢JonAlb的答案。是的,这将只返回id 1的直接子级-结果将是1、2、3,但不会是4。我想可能是这样……我想没有递归就没有办法达到其他级别?……是的,我同意这一点。关于递归,我喜欢JonAlb的答案。是的,这将只返回id 1的直接子项-结果将是1、2、3,但不会是4。谢谢Kevin我已经按照你的建议修复了我的帖子Hanks Kevin我已经按照你的建议修复了我的帖子