首页 文章

SQL 'Not in'涉及三个表的查询

提问于
浏览
1

我有三个表,产品,类别和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不在类别表中 . 我可能完全走错了路,但我被卡住了!提前致谢 .

4 回答

  • 0

    假设:产品可以是存在的类别,不存在的类别或根本没有类别的一部分 . 您还没有要求产品属于任何类别,因此从产品到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)

  • 1

    如果您正在寻找不存在的类别的产品,我建议

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

    试试这个?

相关问题