Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.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_Sql Server 2008 - Fatal编程技术网

SQL查询:需要帮助

SQL查询:需要帮助,sql,sql-server-2008,Sql,Sql Server 2008,我需要sql查询方面的帮助,我尝试通过创建以下简单示例来复制我的实际问题: 父表: id name parent_id 1 parent1 null 2 parent2 1 3 parent3 1 4 parent4 3 5 parent5 3 6 parent6 5 7 parent7 5 亲属表: id name parent_id 1 relative1 2 2

我需要sql查询方面的帮助,我尝试通过创建以下简单示例来复制我的实际问题:

父表:

id   name     parent_id
1   parent1     null
2   parent2     1
3   parent3     1
4   parent4     3
5   parent5     3
6   parent6     5
7   parent7     5
亲属表:

id    name       parent_id
1   relative1   2
2   relative2   3
3   relative3   4
4   relative4   5
5   relative5   7
Parents表有一个父表列表,其中也有父表本身。 “亲属”表中有一个带有父项id列的亲属列表

如何查找parent3的所有亲属,包括parent3的所有“desendants”,即查询应从亲属表返回以下内容:

id    name       parent_id
1   relative1   2
2   relative2   3
3   relative3   4
4   relative4   5
5   relative5   7
relative2(因为父id为3)

relative3(因为父id为4,其父id为3)

relative4(因为父id为5,其父id为3)

relative5(因为父id为7,其父id为5,其父id为3)

我正在使用SQLServer2008。 希望这是有意义的,谢谢你的帮助。

试试这个

;WITH CTE
AS
(
    SELECT [id], [name] FROM  Parents WHERE [name] = 'parent3'
    UNION ALL
    SELECT T1.[id], T1.[name] FROM CTE c 
    INNER JOIN  Parents T1 ON c.[id] = T1.[parent_id]
)

SELECT * FROM Relatives 
WHERE [parent_id] IN (SELECT [id] FROM CTE)

这是递归的常见情况。你应该可以在谷歌上找到很多类似的例子。提示:了解有关递归和CTE的更多信息,您将能够击倒它。如果您仍然有任何问题,请创建一个sqlfiddle并在此处发布您的问题。完美的示例,现在我正在尝试理解它,是否正确:第一次选择从Parents获得id=3和name=parent3。第二个select语句从Parent获取id和name,其中Parent_id=3,这给了我第4行和第5行的id和name。这是我有点不确定的部分,接下来会发生什么;第二个结果集是否“替换”第一个结果集,然后再次运行第二个选择,从id为4或5的父级查找数据。然后,使用每个连续结果集中的id再次运行第二个select。它将继续,直到select不返回任何值。