[英]SQL 'Not in' query involving three tables
我有三個表,產品,類別和product_to_category。 產品具有主鍵product_id,類別category_id和product_to_category p2c_id。 Product_to_ category使用各自的ID將產品鏈接到多對多關系中的類別。
基本上我想編寫一個查詢,從類別表中不存在的類別中選擇所有產品。 這是因為從另一個數據庫遷移了產品。
我有這樣的事情,但有點迷失。
SELECT *
FROM product AS p
LEFT JOIN product_to_category AS p2c ON p.product_id = p2c.product_id
LEFT JOIN category AS c ON c.category_id
基本上這就是我所擁有的。 我需要將類別表連接到product_to_category表,其中product_to_category category_id不在類別表中。 我可能完全走錯了路,但我被卡住了! 提前致謝。
如果您正在尋找不存在的類別的產品,我建議
Select p.*,p2c.category_id
from product p
join product_to_category p2c
on p.product_id=p2c.product_id
left outer join category c
on p2c.category_id=c.category_id
where c.category_id is null
SELECT p.*
FROM product AS p
LEFT JOIN product_to_category AS p2c ON p.product_id = p2c.product_id
WHERE NOT EXISTS (
SELECT 1
FROM category c
WHERE c.category_id = p2c.category_id
)
假設:產品可以是存在的類別,不存在的類別或根本沒有類別的一部分。 您還沒有要求產品屬於任何類別,因此從產品到procduct_to_category的第一個LEFT JOIN應該是INNER JOIN。
警告:我在mysql生銹,所以我使用的是SQL SERVER語法。 我忘了如果mysql有ON子句或使用JOIN的where子句。 如果不支持ON子句,請將它們更改為WHERE子句。
有兩種常見的方法:OUTER JOIN或NOT IN子句(或NOT EXISTS子句,它通常與NOT IN子句的性能相同。)
外聯
選擇p。*,p2c.category_id
來自產品p
INNER JOIN product_to_category p2c ON(p.product_id = p2c.product_id)
LEFT JOIN類別c ON p2c.category_id = c.category_id
WHERE c.category_id是NULL
對null的測試將找到不匹配的記錄。
NOT IN條款
SELECT p。*,p2c.category_id
從產品p
INNER JOIN product_to_category p2c ON(p.product_id = p2c.product_id)
在哪里p2c.category_id NOT IN(SELECT c.category_id FROM category c)
SELECT *
FROM product AS p
JOIN product_to_category AS p2c ON p.product_id = p2c.product_id
JOIN category AS c ON c.category_id != as.category.
嘗試這個?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.