查找 child 不存在的数据

Look for data where child doesn't exisit

如何在 Table C 中查找那些拥有 ParentID 但没有 child.

的检查员

Table A 有 parent 和 child 数据。 Parent ID 0 用于 parents,child 有他们的 parent ID。

在Table C中,一个检查员可以有很多parent和很多child。

我需要 运行 一个查询来寻找那些有 parent 但没有 child.

的检查员
Table A               Table B          Table C           
--------             -------           -------           
DisciplineID(PK)    InspectorID(PK)     ID (PK)        
ParentID                                DisciplineID(FK)            
                                        InspectorID (Fk)   

     Table A                 Table C  

上述数据中,Inspector 7239和7240只有parent,没有child。所以查询应该 return 那两个不是 7242 因为他同时有 parent 和 childs.

使用EXISTSNOT EXISTS:

SELECT c.ID, c.InspectorID, c.DisciplineID
FROM dbo.TableC c
WHERE EXISTS
(
    SELECT 1 FROM dbo.TableA a
    WHERE a.DisciplineID = c.DisciplineID 
      AND a.ParentID = 0  -- parent exists
)
AND NOT EXISTS 
(
    SELECT 1 FROM dbo.TableC c2
    WHERE c.InspectorID = c2.InspectorID 
     AND  c.ID <> c2.ID -- look for another record with this InspectorID 
      AND EXISTS        
      (
          SELECT 1 FROM dbo.TableA a
          WHERE a.DisciplineID = c2.DisciplineID 
          AND a.ParentID <> 0  -- no child exists
      )
)

我将从每个学科的资格预审查询开始,该查询基于那些具有父 ID = 0 但也没有子记录的条目计数的学科...将该结果加入您的 TableC

SELECT 
      c.ID, 
      c.InspectorID, 
      c.DisciplineID
   FROM 
      dbo.TableC c
         JOIN ( select
                      a.DisciplineID
                   from
                      TableA a
                   group by
                      a.DisciplineID
                   having 
                         sum( case when a.ParentID = 0 then 1 else 0 end ) > 0
                     AND sum( case when a.ParentID > 0 then 1 else 0 end ) = 0 ) qual
         on c.DisciplineID = qual.DisciplineID

你可以试试这个:

SELECT DISTINCT B.INSPECTORID FROM TABLEA A 
LEFT JOIN TABLEC CHILD ON CHILD.DISCIPLINEID = A.DISCIPLINEID
LEFT JOIN TABLEC PARENT ON PARENT.DISCIPLINEID = A.PARENTID
JOIN TABLEB B ON A.INSPECTORID = B.INSPECTORID
WHERE (A.PARENTID = 0 AND CHILD.DISCIPLINEID IS NOT NULL)