Sql 选择仅给定childID的ParentID的所有子项
我在SQLServerDB中有一个表,它包含两个标识列:父列和子列。例如: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
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和自连接解决方案可用。可能是一个汇总或多维数据集,但我对这些分组不太熟悉。我测试了它,它实际上有与我的交叉应用版本相同的执行计划。我同意这更具可读性