[英]How to filter a many-to-many left join using the rightmost table?
假設我有以下表格:
機器
| id | name |
+----+---------+
| 1 | Blender |
| 2 | Slicer |
| 3 | Masher |
部分
| id | name | instock |
+----+-----------------+---------+
| 1 | Blade | 5 |
| 2 | Rotating engine | 0 |
| 3 | Plug | 10 |
| 4 | Wire | 10 |
MachinePart (多對多)
| 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
如何根據相關表part
中的字段過濾machinepart
?
如果重要的話,我正在使用 PostgreSQL。 (但我認為解決方案將是通用的)
WHERE P.INSTOCK IS NOT NULL
您也可以使用IS NULL
來獲取所有“缺貨”零件
編輯:我沒有看到您確實想要沒有零件的機器的結果(因為“零件缺貨”或“零件有貨”對於沒有零件的機器都沒有意義?)
WHERE P.INSTOCK IS NOT NULL
OR MP.PID IS NULL
edit2:<第二個建議也不起作用>
我想你想要一個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;
編輯:
這會產生您要求的結果:
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
WHERE (p.instock > 0 OR p.instock IS NULL);
這是一個 db<>fiddle。
不過,這似乎是不尋常的邏輯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.