【问题标题】:Compare two MySQL tables and select distinct entries in second one比较两个 MySQL 表并在第二个表中选择不同的条目
【发布时间】:2019-04-05 14:18:38
【问题描述】:

我有两个 MySQL 表,每个表有一列。我想选择第一个表中不存在的第二个表中的条目。

我尝试了以下查询,但似乎不起作用

SELECT column_name FROM `table_name_1` 
WHERE NOT EXISTS (SELECT column_name FROM `table_name_2`); 

例如: 表名_1

column 
111111111111
222222222222
333333333333
444444444444

table_name_2

column
222222222222
333333333333
555555555555
666666666666

现在,我只想在 table_name_2 中获得 55555555555 和 66666666666 个条目。

【问题讨论】:

标签: mysql mysql-workbench mysql-error-1064


【解决方案1】:

您可以简单地Left Join从表 2 到表 1 并获取所有那些 唯一 值,对应于表 1 中不存在匹配项 (t1.column_name is null)

另外,请注意,为了提高性能,您需要在各自表中的两个列上建立索引。

请尝试以下方法:

SELECT DISTINCT t2.column_name  
FROM table_name_2 AS t2 
LEFT JOIN table_name_1 AS t1 ON t1.column_name = t2.column_name 
WHERE t1.column_name IS NULL 

注意,如果列值被限制为唯一(PK 或 Unique 约束),或者您不关心结果中是否出现重复值,您可以删除 DISTINCT 中使用的关键字上面的查询。


结果:

| column_name  |
| ------------ |
| 555555555555 |
| 666666666666 |

View on DB Fiddle

【讨论】:

  • 两个表都很大,查询运行了几个小时没有结果。
  • @AhmedMaher 你在表上定义了任何索引吗?
  • 不,两个表都是 1 列表,并且该列是主列。
  • @AhmedMaher 因为该列是主键。您可以从我的查询中删除DISTINCT,然后重试。
【解决方案2】:

您的查询应该适用于此。 Check fiddle

SELECT DISTINCT column_name 
FROM   table_name_2 
WHERE  column_name NOT IN (SELECT column_name 
                           FROM   table_name_1); 

【讨论】:

  • 与其他解决方案一样,两个表都很大,查询运行了几个小时而没有结果。
【解决方案3】:

所以需要第二张表中的一些记录。
那么第二个表必须在外部查询中。

(NOT) EXISTS 标准不同于 (NOT) IN。
使用 EXISTS 时,需要在 EXISTS 中添加 EXISTS 中的查询与外部查询之间的关系。

SELECT DISTINCT column_name 
FROM `table_name_2` AS t2
WHERE NOT EXISTS (
     SELECT 1 
     FROM `table_name_1` AS t1
     WHERE t1.column_name = t2.column_name
); 

SqlFiddle 测试here

【讨论】:

  • 两个表都很大,查询运行了几个小时没有结果。
  • 然后我假设table_name_1.column_name 上没有索引。我不知道为什么您的真实表格没有结果。也许 t1 在 t2 中对所有人都有一个匹配的 column_name?
  • @AhmedMaher 您可以尝试的另一个技巧是在 column_name 上使用具有主键的临时表。然后将唯一值插入其中。 F.e. insert into tmpTable (column_name) select column_name from table_name_1 where column_name is not null group by column_name。然后更改查询,使其改用临时表。它可能会更快,因为它可能有更少的记录,并且会在您尝试匹配的字段上建立索引。
  • 有结果,我知道。两个表都是 1 个列表,并且该列是主列。如何更改两个表并添加单独的主键列?这会有帮助吗?
  • @AhmedMaher 我有点假设您的真实表格会有更多列,并且您简化了问题的问题。那么为什么不把那一列作为两个表的主键呢?之后你不能在其中插入副本。这也将开辟另一种可能的解决方案:MINUS 运营商。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-12
  • 1970-01-01
  • 2015-10-20
  • 1970-01-01
  • 2021-06-17
  • 1970-01-01
相关资源
最近更新 更多