显示不符合子项条件的 SQL 1toM 联接查询



我有一个一对多的表,我想运行一个查询,只显示那些记录在子表中某个字段有某个值的记录,以及看到所有那些在父表中没有这个值。

表格示例:

 A (parent)            B (child)    
============    =============================
 id | name        pid | typeid |    phone
------------    -----------------------------
  1 | Alex         1  |   1    | 555-555-5555
  2 | Bill         1  |   2    | 555-555-5556
  3 | Cath         2  |   1    | 555-555-5557
  4 | Dale         3  |   1    | 555-555-5558       
  5 | Evan         3  |   2    | 555-555-5559
  6 | Steve        3  |   3    | 555-555-5561
  7 | Henry        4  |   1    | 555-555-5562
  8 | Paul         5  |   1    | 555-555-5563
                   6  |   1    | 555-555-5564  

我希望的结果是,我可以得到所有那些有一个类型为2的电话号码,以及知道哪些父母没有在子表中有重复的结果。所以最终期望的输出是:

 Desired Output (parent joined child)    
==========================================
 id | name  | pid  | typeid |    phone
------------------------------------------
  1 | Alex  |   1  |   2    | 555-555-5556
  2 | Bill  | null |  null  |    null
  3 | Cath  |   3  |   2    | 555-555-5559
  4 | Dale  | null |  null  |    null
  5 | Evan  | null |  null  |    null
  6 | Steve | null |  null  |    null
  7 | Henry | null |  null  |    null
  8 | Paul  | null |  null  |    null                       
到目前为止,我尝试的查询看起来像:
SELECT id,  name, pid, typeid, phone
FROM
        parent  LEFT OUTER JOIN  child
  ON   parent.id     =    child.pid
WHERE typeid = 2 or typeid is null

将返回一个id为1,3,7,8的列表,但由于id 2,4,5,6在子表中已经有一个条目,因此它们不会被计算为空,因为理论上它们可以连接到记录,而不是typeid为2的记录。

 Current Output (parent joined child)    
==========================================
 id | name  |  pid | typeid |    phone
------------------------------------------
  1 | Alex  |   1  |   2    | 555-555-5556
  3 | Cath  |   3  |   2    | 555-555-5559
  7 | Henry | null |  null  |    null
  8 | Paul  | null |  null  |    null    

我认为替代方案是做一个联合表,但即使这样,我不知道如何测试一个连接,其中一个元素(typeid = 2)不存在,没有使id 3的两个条目弹出。所以我想我正在寻找一种分组的方法,但对子表中由groupby填充的数据有选择性。

将类型标准移动到连接子句中,而不是where子句中。

SELECT id, name, pid, typeid, phone
FROM parent  LEFT OUTER JOIN  child
ON parent.id = child.pid and child.typeid = 2

这将选择所有符合条件的父级和左联接子级。

最新更新