繁体   English   中英

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

[英]Select from one table where not in another

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

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

SELECT `pm`.`id`
FROM `R2R`.`partmaster` `pm`
WHERE NOT EXISTS (
    SELECT * 
    FROM `wpsapi4`.`product_details` `pd`
    WHERE `pm`.`id` = `pd`.`part_num`
)

所以查询试图做如下:

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

扩展 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)

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

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

确保您在相关字段上有索引
您需要在pm.idpd.part_num上有一个索引。

您可以 LEFT JOIN 两个表。 如果第二个表中没有相应的行,则值将为 NULL。

SELECT id FROM partmaster LEFT JOIN product_details ON (...) WHERE product_details.part_num IS NULL

为了扩展 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)
  • 抱歉,我无法添加评论,因为我没有代表!

所以网上有很多帖子展示了如何做到这一点,我找到了 3 种方法,与 Johan & Sjoerd 指出的相同。 我无法让这些查询中的任何一个工作,很明显它们工作正常,这是我的数据库工作不正常,并且这些查询都运行缓慢。

所以我想出了其他人可能会觉得有用的另一种方法:

它的基本原理是创建一个临时表并用所有信息填充它,然后删除另一个表中的所有行。

所以我做了这 3 个查询,它运行得很快(在几分钟内)。

CREATE TEMPORARY TABLE

`database1`.`newRows`

SELECT

`t1`.`id` AS `columnID`

FROM

`database2`.`table` AS `t1`

.

CREATE INDEX `columnID` ON `database1`.`newRows`(`columnID`)

.

DELETE FROM `database1`.`newRows`

WHERE

EXISTS(
    SELECT `columnID` FROM `database1`.`product_details` WHERE `columnID`=`database1`.`newRows`.`columnID`
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM