Mysql 从表中获取键在另一个表中不匹配的所有行

Mysql 从表中获取键在另一个表中不匹配的所有行,mysql,sql,Mysql,Sql,我有一个名为products的表和一个名为product\u description的表 它们都有一个名为product_id的列,用于链接它们。 如何从product_id为的product_description表中获取所有行 在产品表中找不到 我试过这个: 选择* 来自“产品描述” 在product\u description.product\u id=product.product\u id上加入产品 其中product_description.product_id!=product.p

我有一个名为products的表和一个名为product\u description的表 它们都有一个名为product_id的列,用于链接它们。 如何从product_id为的product_description表中获取所有行 在产品表中找不到

我试过这个:

选择* 来自“产品描述” 在product\u description.product\u id=product.product\u id上加入产品 其中product_description.product_id!=product.product\u id 但返回的行数为零。

内部联接过滤掉不匹配的行数。这就是为什么您的查询没有得到任何结果。你需要的是外部连接

或者,可以使用不在中的子查询

或者不存在

下面是所有上述查询的演示


要更好地理解联接,请参见使用左外部联接并查找不匹配的位置:

SELECT product_description.* 
FROM `product_description` left outer join product
      on product_description.product_id = product.product_id
where product.product_id is null

不管您缺少的左连接是什么,您似乎都存在一个引用完整性问题:您如何拥有没有产品的产品描述?因为我正在修改旧系统中的表以移动到新系统中,而旧系统被弄乱了,不在其中,空值也无法正常使用请参见此。没有足够的信息来假设其中没有空值,特别是在出现此引用完整性问题之后。@MostyMostacho这是一个常见的事实,正如您所说,没有足够的信息,但可以假设product_id是一个PK,是的,有一种方法可以以空安全的方式重新写入它。不过还是要谢谢你的意见。
SELECT * 
  FROM product_description 
 WHERE product_id NOT IN
(
  SELECT product_id 
    FROM product
)
SELECT * 
  FROM product_description d
 WHERE NOT EXISTS 
(
  SELECT * 
    FROM product
   WHERE product_id = d.product_id
)
SELECT product_description.* 
FROM `product_description` left outer join product
      on product_description.product_id = product.product_id
where product.product_id is null