我有一个一对多的表,我想运行一个查询,只显示那些记录在子表中某个字段有某个值的记录,以及看到所有那些在父表中没有这个值。
表格示例:
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
这将选择所有符合条件的父级和左联接子级。