选择仅给定childID的ParentID的所有子项

时间:2017-07-12 19:08:26

标签: sql sql-server

我在SQL Server数据库中有一个表,其中包含两个标识列:父级和子级。例如:

ParentID    ChildID
1           101
1           102
1           103
2           104
2           105
2           106

我想只选择ChildID来选择父级的所有子级。因此,给定101,我将得到101,102和103,因为它们都共享同一个父母。我知道这可以通过自联接或使用CROSS APPLY来完成,例如

SELECT * FROM 
TABLE1 T
CROSS APPLY
(
SELECT ChildID
FROM TABLE1 
WHERE ParentID= T.ParentID
) CA
WHERE T.ChildID= @ChildID

是否有更适合这种情况的分组功能,还是应该保持自我加入?

编辑:还试图避免使用CTE

2 个答案:

答案 0 :(得分:0)

可能有很多方法可以做到这一点。很难分辨哪一个是最佳表现。最简单的方法是在同一查询窗口中在SSMS中运行您喜欢的方式,并包括实际的执行计划。

我认为另外一个选项非常易读:

SELECT ParentID, ChildID
FROM TABLE1 
INNER JOIN
(
    SELECT ParentID
    FROM TABLE1 
    WHERE ChildID = @YourChildId
) T ON TABLE1.ParentID = T.ParentID

答案 1 :(得分:0)

另一种选择......

IF OBJECT_ID('tempdb..#TestData', 'U') IS NOT NULL 
DROP TABLE #TestData;

CREATE TABLE #TestData (
    ParentID INT NOT NULL,
    ChildID INT NOT NULL 
    );

INSERT #TestData(ParentID, ChildID) VALUES 
    (1, 101), (1, 102), (1, 103), (2, 104), (2, 105), (2, 106);

--============================================

SELECT 
    td1.ParentID,
    td1.ChildID
FROM 
    #TestData td1
WHERE 
    EXISTS (
            SELECT 1 
            FROM 
                #TestData td2 
            WHERE 
                td1.ParentID = td2.ParentID 
                AND td2.ChildID = 101
            );