如何解决如何使用最右边的表格过滤多对多的左联接?
假设我有以下表格:
机器
| id | name |
+----+---------+
| 1 | Blender |
| 2 | Slicer |
| 3 | Masher |
零件
| id | name | instock |
+----+-----------------+---------+
| 1 | Blade | 5 |
| 2 | Rotating engine | 0 |
| 3 | Plug | 10 |
| 4 | Wire | 10 |
机器零件(多对多)
| mid | pid |
+-----+-----+
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 1 | 4 |
| 2 | 1 |
| 2 | 3 |
| 2 | 4 |
我希望一个查询列出所有有零件(外部连接)的机器,只要零件有库存。
我尝试在LEFT JOIN中执行条件,但是中间表生成了不需要的记录:
SELECT m.id,m.name,mp.pid,p.name,p.instock
FROM machine m
LEFT JOIN machinepart mp ON mp.mid = m.id
LEFT JOIN part p ON p.id = mp.pid AND instock > 0
| id | name | pid | name | instock |
+----+---------+------+-------+---------+
| 1 | Blender | 1 | Blade | 5 |
| 1 | Blender | 2 | NULL | NULL | -> I don't want this record
| 1 | Blender | 3 | Plug | 10 |
| 1 | Blender | 4 | Wire | 10 |
| 2 | Slicer | 1 | Blade | 5 |
| 2 | Slicer | 3 | Plug | 10 |
| 2 | Slicer | 4 | Wire | 10 |
| 3 | Masher | NULL | NULL | NULL | -> But good,I want this record
如何根据相关表machinepart
中的字段过滤part
?
如果有关系,我正在使用PostgreSQL。 (但我认为解决方案将是通用的)
解决方法
WHERE P.INSTOCK IS NOT NULL
您还可以使用IS NULL
来获取所有“缺货”部分
编辑:我没看到您是否想要没有零件的机器的结果(因为“没有零件的库存”和“零件没有库存”对于没有零件的机器都有意义吗?)
WHERE P.INSTOCK IS NOT NULL
OR MP.PID IS NULL
edit2:
,我认为您需要一个DNS redirect not forwarding path
,然后再一个INNER JOIN
:
LEFT JOIN
编辑:
这将产生您要求的结果:
SELECT m.id,m.name,mp.pid,p.name,p.instock
FROM machine m INNER JOIN
machinepart mp
ON mp.mid = m.id LEFT JOIN
part p
ON p.id = mp.pid AND p.instock > 0;
https://devcenter.heroku.com/articles/automated-certificate-management#view-your-certificate-status是db 小提琴。
不过,看起来好像逻辑异常。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。