簡體   English   中英

如何排除表之間一對多關系中的行(SQL查詢)

[英]How to exclude row in one-to-many relationship between tables (SQL query)

我有兩個表,Products 和 ProductTags(我也有表標簽,這不是問題的一部分)

我的查詢是

SELECT
product.id
FROM
Products JOIN ProductTags ON Products.id = ProductTags.product_id
WHERE ProductTags.tag_id = 10  and ProductTags.tag_id <> 20

表 ProductTags 是 product_id 和 tag_id 之間的一對多連接,如果這樣調用的話。 假設整個 ProductTags 表是:

product_id tag_id
777 10
777 20
888 10
888 30

我從查詢中得到的 output 是 777 和 888。但我想排除標簽為 #20 的產品。 在實際查詢中,我還加入了其他表(我還需要訪問 Products 表的其他字段),所以我無法僅使用 ProductTags 表獲得正確的結果! 我知道我可以這樣做

SELECT product_id ProductTags WHERE tag_id = 10

但這不是正確的解決方案!

一種方法是使用聚合。

SELECT product_id id
       FROM producttags
       WHERE tag_id IN (10,
                        20)
       GROUP BY product_id
       HAVING max(tag_id) = 10;

另一個使用NOT EXISTS和相關子查詢。

SELECT pt1.product_id
       FROM producttag pt1
       WHERE pt1.tag_id = 10
             AND NOT EXISTS (SELECT *
                                    FROM producttag pt2
                                    WHERE pt2.product_id = pt1.product_id
                                          AND pt2.tag_id = 20);

請注意, product的連接不需要僅獲取產品 ID,除非producttags.product_id沒有適當的外鍵約束。

SELECT product.id
FROM Products 
JOIN ProductTags ON Products.id = ProductTags.product_id
GROUP BY product.id
HAVING SUM(ProductTags.tag_id = 10) > 0 -- at least one
   AND SUM(ProductTags.tag_id = 20) = 0 -- none

這種形式允許任意數量的簡單或復雜條件。

例如:

-- strictly one row with tag_id = 30
   AND SUM(ProductTags.tag_id = 30) = 1
-- at least one tag_id 40 or 50
   AND SUM(ProductTags.tag_id IN (40, 50)) > 0
-- ... and so on

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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