0

我有一个名为products的表和一个名为product_description的表 它们都有一个名为product_id的列,用于链接它们。如何从product_description表中获取product_id未在 products 表中找到的所有行?

我试过这个:

SELECT * 
FROM `product_description` 
JOIN product ON product_description.product_id = product.product_id
WHERE product_description.product_id != product.product_id

但这返回了零行。

4

2 回答 2

1

使用左外连接并查找没有匹配项的位置:

SELECT product_description.* 
FROM `product_description` left outer join product
      on product_description.product_id = product.product_id
where product.product_id is null
于 2013-11-07T18:09:05.803 回答
0

INNER JOIN过滤掉不匹配。这就是为什么您的查询没有得到任何结果的原因。你需要的是一个OUTER JOIN

SELECT * 
  FROM product_description d LEFT JOIN product p
    ON d.product_id = p.product_id
 WHERE p.product_id IS NULL

或者您可以使用子查询NOT IN

SELECT * 
  FROM product_description 
 WHERE product_id NOT IN
(
  SELECT product_id 
    FROM product
)

或与NOT EXISTS

SELECT * 
  FROM product_description d
 WHERE NOT EXISTS 
(
  SELECT * 
    FROM product
   WHERE product_id = d.product_id
)

这是所有上述查询的SQLFiddle演示

为了更好地理解JOIN,请参阅SQL 连接的可视化解释

于 2013-11-07T18:08:59.277 回答