簡體   English   中英

如何使用最右邊的表過濾多對多左連接?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM