寻找孩子不存在的数据

时间:2015-02-16 11:59:32

标签: sql sql-server sql-server-2008

如何在表C中查看已获得ParentID但不是子女的检查员。

表A包含父数据和子数据。父ID 0用于父母,子用于父ID。

在表C中,一名检查员可以有许多父母和许多孩子。

我需要运行一个查询来寻找那些有父母但不是孩子的检查员。

Table A               Table B          Table C           
--------             -------           -------           
DisciplineID(PK)    InspectorID(PK)     ID (PK)        
ParentID                                DisciplineID(FK)            
                                        InspectorID (Fk)   

enter image description here

     Table A                 Table C  

在上述数据中,Inspector 7239和7240只有父,但没有子。所以查询应该返回那两个而不是7242,因为他有父和子。

3 个答案:

答案 0 :(得分:0)

使用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
      )
)

答案 1 :(得分:0)

我会从每个学科的资格预审查询开始,这些查询基于具有父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

答案 2 :(得分:0)

你可以试试这个:

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)