SQL标识记录所有子值的记录

时间:2014-07-25 15:49:50

标签: sql sql-server

我正在尝试识别所有父级子记录的所有记录,因为我需要将这些记录包装到父级别。例如,如果您想象两个表:

tblParentChild

Id       Code       ParentCode
-------------------------------
1        B001       
2        P001   
3        B002       B001       
4        B003       B001
5        P002       P001
6        P003       P001
7        P004       P001

tblData

Header Id   Code
-------------------
1           P002
2           B002
2           B003
3           P003
3           P004
4           P002    
4           P003
4           P004

所以在这个例子中我想要返回标题2和4,因为它们存在所有子记录。我一直在将这两个表中的子记录连接起来并比较结果(P002; P003; P004),但我确信必须有更好的方法来实现这个目标吗?

1 个答案:

答案 0 :(得分:0)

它有点难看,可能像垃圾一样,但我认为这样可行:

; WITH parentCTE (ParentCode, PCCount) AS
    (SELECT ParentCode, PCCount = count(*) 
     FROM #tblParentChild 
     WHERE ParentCode IS NOT NULL 
     GROUP BY ParentCode)
SELECT HeaderID
FROM #tblData d
INNER JOIN #tblParentChild pc ON pc.Code = d.Code
GROUP BY pc.ParentCode, d.HeaderID
HAVING count(pc.Code) = (SELECT PCCount FROM parentCTE WHERE ParentCode = pc.ParentCode)