簡體   English   中英

SQL'不在'涉及三個表的查詢

[英]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子句的性能相同。)

  1. 外聯

    選擇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的測試將找到不匹配的記錄。

  1. 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.

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