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

Sql 选择仅给定childID的ParentID的所有子项,sql,sql-server,Sql,Sql Server,我在SQLServerDB中有一个表,它包含两个标识列:父列和子列。例如: ParentID ChildID 1 101 1 102 1 103 2 104 2 105 2 106 我想选择父对象的所有子对象,只提供ChildID。给定101,我会得到101102,和103,因为他们都有相同的父母。我知道这可以通过自连接或交叉应用来实现,例如 SELECT * FROM

我在SQLServerDB中有一个表,它包含两个标识列:父列和子列。例如:

ParentID    ChildID
1           101
1           102
1           103
2           104
2           105
2           106
我想选择父对象的所有子对象,只提供ChildID。给定101,我会得到101102,和103,因为他们都有相同的父母。我知道这可以通过自连接或交叉应用来实现,例如

SELECT * FROM 
TABLE1 T
CROSS APPLY
(
SELECT ChildID
FROM TABLE1 
WHERE ParentID= T.ParentID
) CA
WHERE T.ChildID= @ChildID
是否有更适合这种情况的分组函数,或者我应该保持自连接


编辑:另外,要避免使用CTE,可能有很多方法。很难说哪一个性能最好。最简单的方法是在同一个查询窗口中以您最喜欢的方式在SSMS中运行,并包括实际的执行计划

另外一个我认为非常可读的选项是:

SELECT ParentID, ChildID
FROM TABLE1 
INNER JOIN
(
    SELECT ParentID
    FROM TABLE1 
    WHERE ChildID = @YourChildId
) T ON TABLE1.ParentID = T.ParentID
另一个选择

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
            );

你想要所有的兄弟姐妹?是的。我还应该补充一点,我正在寻找一个非CTE的解决方案以及。不是因为我讨厌CTE,而是想知道为什么你现在要避免CTE…只是想知道有哪些非CTE和自连接解决方案可用。可能是一个汇总或多维数据集,但我对这些分组不太熟悉。我测试了它,它实际上有与我的交叉应用版本相同的执行计划。我同意这更具可读性