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

ws51t4hk  于 2023-06-21  发布在  Mysql
关注(0)|答案(5)|浏览(147)

我试图找到一个表中的行,但另一个表中没有,这两个表在不同的数据库中,并且在我用来匹配的列上具有不同的列名。
我有一个查询,下面的代码,我认为它可能工作,但它太慢了:

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

mznpcxlj

mznpcxlj1#

扩展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上有一个索引。

tjjdgumg

tjjdgumg2#

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

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

3gtaxfhh3#

为了扩展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)
  • 对不起,我不能添加评论,因为我没有代表!
velaa5lx

velaa5lx4#

所以网上有很多文章展示了如何做到这一点,我发现了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`
)
oxf4rvwz

oxf4rvwz5#

对我有效的简单解决方法如下:

SELECT
    first_table.*
FROM
    first_table
    LEFT JOIN second_table ON second_table.common_column = first_table.common_column 
WHERE
    second_table.common_column IS NULL;

相关问题