Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql父子表访谈问题_Sql_Database - Fatal编程技术网

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,找到所有

我在一次采访中被问到这个问题,但我不熟悉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,找到所有的孩子 所以对于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我已经按照你的建议修复了我的帖子