从一个表中选择不在另一个表中

Dra*_*cir 56 mysql sql

我试图找到一个表而不是另一个表中的行,两个表都在不同的数据库中,并且在我用来匹配的列上也有不同的列名.

我有一个查询,下面的代码,我认为它可能有效,但它太慢了:

SELECT `pm`.`id`
FROM `R2R`.`partmaster` `pm`
WHERE NOT EXISTS (
    SELECT * 
    FROM `wpsapi4`.`product_details` `pd`
    WHERE `pm`.`id` = `pd`.`part_num`
)
Run Code Online (Sandbox Code Playgroud)

所以查询尝试执行如下操作:

从R2R.partmaster数据库中选择不在wpsapi4.product_details数据库中的所有ID.我匹配的列是partmaster.id和product_details.part_num

Joh*_*ica 98

扩展Sjoerd的反连接,您还可以使用易于理解的SELECT WHERE X NOT IN (SELECT)模式.

SELECT pm.id FROM r2r.partmaster pm
WHERE pm.id NOT IN (SELECT pd.part_num FROM wpsapi4.product_details pd)
Run Code Online (Sandbox Code Playgroud)

请注意,您只需要`对保留字,带空格的名称等使用反引号,而不是使用普通列名.

在MySQL 5+上,这种查询运行速度非常快.
在MySQL 3/4上它很慢.

确保您在相关字段上有索引
您需要索引pm.id,pd.part_num.

  • 只是提醒一下类似的查询在MySQL 5.1.73a上大约花了大约10分钟.当我升级到MySQL 5.6.22时,花了大约456ms. (2认同)

Sjo*_*erd 60

你可以LEFT JOIN这两个表.如果第二个表中没有对应的行,则值将为NULL.

SELECT id FROM partmaster LEFT JOIN product_details ON (...) WHERE product_details.part_num IS NULL
Run Code Online (Sandbox Code Playgroud)


小智 8

为了扩展 Johan 的答案,如果子选择中的 part_num 列可以包含空值,那么查询将中断。

要纠正此问题,请添加空检查...

SELECT pm.id FROM r2r.partmaster pm
WHERE pm.id NOT IN 
      (SELECT pd.part_num FROM wpsapi4.product_details pd 
                  where pd.part_num is not null)
Run Code Online (Sandbox Code Playgroud)
  • 抱歉,我无法添加评论,因为我没有代表!