我在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
答案 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
);