【问题标题】:MySQL - How to get a list of values in Table A that don't exist in Table B?MySQL - 如何获取表 A 中不存在于表 B 中的值列表?
【发布时间】:2009-07-03 14:23:10
【问题描述】:
**Table A**
1
2
3
4
5
6


**Table B**
2
3
5

如何选择仅存在于表 B 中的条目 ID?在此示例中,我正在寻找返回 1、4 和 6 的查询。

【问题讨论】:

  • 这些值是什么?身份证?提供表格结构实际上会让我们更轻松
  • 抱歉,是的,它们是 ID。我最初提供了更多信息,但后来我想我只会减少相关的部分。显然我削减得太多了。

标签: mysql


【解决方案1】:

假设列名为“id”,则:

SELECT *
FROM tableA a
WHERE NOT EXISTS (SELECT 1 FROM tableB WHERE id = a.id)

SELECT *
FROM TableA
WHERE id NOT IN (SELECT id FROM tableB)

您可能需要测试一下哪个性能最好。 MySQL 可能有点不可预测。

【讨论】:

  • 啊,太完美了!谢谢!性能在这里不是问题,因为这是一次性查询。
【解决方案2】:

试试

select value from B where value not in (select value from A)

获取 B 中不存在于 A 中的值。

要获得相反的结果(A 中的值不在 B 中),请使用

select value from A where value not in (select value from B)

【讨论】:

  • 我很想知道这对提供的答案 cletus 的表现如何。我最初的想法是用他写的东西来回答,但这不是更快吗?嗯。
  • 如果表 B 可以包含 NULL 值,NOT IN 是一个危险的工具,请参阅stackoverflow.com/questions/129077/… 考虑使用 NOT EXISTS。
【解决方案3】:

这避免了IN + 子查询:

SELECT A.value FROM A
LEFT OUTER JOIN B ON (A.value = B.value)
WHERE B.value IS NULL

因为IN (subquery) isn't optimized 因为它是针对表 A 中找到的每个行执行的

【讨论】:

  • 这取决于查询优化器。例如,Sql Server 将以相同的方式执行这两个查询。
  • 是的,但是问题是针对 mysql 的,文档中说这个查询(显然还在 6.0 中)被优化器搞砸了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-16
  • 2021-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-10
相关资源
最近更新 更多