SQL-如何在1个查询中选择所有动态父数据和子数据

时间:2014-05-16 15:16:12

标签: sql sql-server

我想选择所有包含父级和子级的数据。我有一个这样的样本表:

ID  Name        Parent  
1   Mike        6000    
2   Mike_x1     1
3   Mike_x2     2
4   Mike_x3     6333
5   Mike_x4     2
6   Mike_x5     3
7   Bob_x2      5

首先,我选择数据来获取标题:

select * from table1 where parent = 1

我得到这样的标题数据:

ID  Name        Parent
2   Mike_x1     1

从标题我得到一个新的ID = 2作为标题数据。所以我再选择一个孩子:

select * from table1 where parent = 2

我得到这样的数据:

ID  Name        Parent
3   Mike_x2     2
5   Mike_x4     2

从第一个孩子我得到一个新ID = 3和ID = 5.所以我再次选择另一个孩子:

select * from table1 where parrent = 3

select * from table1 where parrent = 5

我得到的数据是这样的:

ID  Name        Parrent
6   Mike_x5     3

ID  Name        Parrent
7   Bob_x2      5

这是我的父母和孩子的步骤。但我想选择使用1个查询来获取所有父数据和子数据。当我第一次选择获取标题select * from table1 where parrent = 1时,我会得到如下结果:

ID  Name        Parrent
2   Mike_x1     1
3   Mike_x2     2
5   Mike_x4     2
6   Mike_x5     3
7   Bob_x2      5

有人帮帮我吗?我是否可以通过1个查询来完成,这不需要选择手动,如select * from parent = 1,2,3,5 etc

2 个答案:

答案 0 :(得分:1)

SELECT DISTINCT * FROM table1
WHERE ID IN (SELECT Parent FROM table1)
AND Parent IN (SELECT ID FROM table1)
ORDER BY ID ASC

答案 1 :(得分:0)

假设我对这个问题的理解是正确的,这将“选择所有拥有父母和子女的数据”

Select T1.*
FROM TableName T1
INNER JOIN tableName Parents
 on T1.ParentID = Parents.ID
INNER JOIN tableName Kids
 on Kids.ParentID = T1.ID

更正了最后一个元素的内连接Kids.ID应该是Kids.ParentID

应该导致

    ID  Name        Parent  
    2   Mike_x1     1 
    3   Mike_x2     2 
    5   Mike_x4     2 

这是有效的,因为内部自我连接排除了没有父母或孩子的记录。

如果这些不是预期的结果:预期的结果是什么?

如果您需要知道父母是谁以及孩子只是添加到选择

Select t1.*, Parents.*, Kids.*

然而,如果你需要遍历hieracy并列出孩子的父母孩子等...那么需要XML路径或cte。