SQL 1toM连接查询显示Child未满足条件的情况

时间:2014-05-19 23:44:42

标签: sql join

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

表格示例:

 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  

我希望的结果是,我可以获得所有拥有typeid为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已经在子表中有一个条目,因此从理论上来说它们不会被评估为null他们可以加入一个记录,而不是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填充的数据。

1 个答案:

答案 0 :(得分:1)

将类型条件移动到join子句而不是where子句。

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

这将选择符合您标准的所有父母和左联接儿童。