【问题标题】:Select from table A which does not exist in table B从表 B 中不存在的表 A 中选择
【发布时间】:2013-03-31 04:48:00
【问题描述】:

我正在尝试为 MySQL 编写一个 SELECT 语句,该语句从表 A 中选择表 B 中不存在的内容。例如:

表 A:

+------+
| BAND |
+------+
| 1    |
| 2    |
| 3    |
| 4    |
| 5    |
+------+

表 B:

+------+
| HATE |
+------+
| 1    |
| 5    |
+------+

因此,如果表 A 是所有乐队,而表 B 是我讨厌的乐队,那么我只想要我不讨厌的乐队。所以选择的结果应该是:

+------+
| BAND |
+------+
| 2    |
| 3    |
| 4    |
+------+

我将如何为此编写单个选择?这是我最后一次尝试:

SELECT * FROM A LEFT JOIN B ON A.BAND = B.HATE WHERE B.HATE IS NULL;

编辑:上面的行已修复!请参阅下面的 cmets..."= NULL" 与 "IS NULL"。

【问题讨论】:

  • @Michelle 您的查询似乎没问题。为什么你说它不起作用?
  • 在下面查看我的评论。对于其他有同样问题的人,“IS NULL”与 MySQL 中的“= NULL”不同。我尝试了一种方法并且查询有效,另一种方法返回一个空集。奇怪!!!
  • 不仅在 MySQL 中,而且在任何 SQL 方言中。 SQL 中的NULL 值具有不同于任何其他值的属性,包括另一个NULL。因此,您不能指望= NULL 处理 SQL 查询……您需要使用 IS NULL

标签: mysql select


【解决方案1】:

你可以使用IN,但是效率超级低:

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

【讨论】:

  • 为什么这比使用连接更好?
  • 如果表 A 或 B 很大,我认为这很慢(对于小表,性能差异几乎没有)
  • 我从来没有说过它更好,我实际上说相反。 IN 很烂,因为它对检查的每一行都运行内部查询(因此,对于 tableA 中的每一行)。
【解决方案2】:

我会使用连接

select A.*
from A left join B on A.BAND = B.HATE
where B.HATE IS NULL;

记住:为您的表创建适当的索引

【讨论】:

  • 这与我尝试的几乎相同(参见上面的回复)。您只要求 A.* 作为 select 语句的回报...也许这就是问题所在。
  • 它应该会给你正确的答案! (顺便说一句,我在你编辑之前发布了这个)。这应该返回您需要的内容。或者你为什么说它没有返回你需要的东西?
  • 好的 - 我找到了问题!我正在测试“B.HATE = NULL”,而不是“B.HATE IS NULL”。我上面的文本是我用来创建我的 SQL 命令的,但是当我实际输入代码(进入 PHP 字符串)时,我将其更改为 = NULL。奇怪他们是不同的!?
  • @Michelle 据我所知,在 SQL 中,NULL 不同于任何其他值,包括其他 NULL。在编程语言中通常会找到a == Null 之类的东西,但是(至少)在 MySQL 中,如果要过滤空值,则需要使用 IS NULL 来测试空值,或者使用 ISNULL() 函数,如果参数为空,则返回 TRUE
【解决方案3】:
SELECT * FROM tableA WHERE id NOT EXISTS (SELECT DISTINCT id FROM tableB)

SELECT * FROM tableA WHERE id NOT EXISTS (SELECT id FROM tableB GROUP BY id)

【讨论】:

    【解决方案4】:
    SELECT BAND FROM A WHERE BAND NOT EXISTS(SELECT DISTINCT HATE FROM B)
    

    SELECT BAND FROM A WHERE NOT EXISTS ( SELECT HATE FROM B WHERE A.BAND = B.HATE);
    

    【讨论】:

      猜你喜欢
      • 2019-05-16
      • 1970-01-01
      • 1970-01-01
      • 2022-01-09
      • 1970-01-01
      • 2011-06-07
      • 1970-01-01
      • 2019-10-04
      • 1970-01-01
      相关资源
      最近更新 更多