我有一个一对多的表,我想运行查询并仅显示那些在子表中某个字段具有特定值的记录以及在父表中看到所有那些没有的记录的记录这个值。
表格示例:
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填充的数据。
答案 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
这将选择符合您标准的所有父母和左联接儿童。