MySQL 从表A中选择表B中不存在的

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/15890367/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-31 17:16:05  来源:igfitidea点击:

Select from table A which does not exist in table B

mysqlselect

提问by TSG

I am trying to compose a SELECT statement for MySQL which select from table A what does not exist in table B. For example:

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

Table A:

表一:

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

Table B:

表 B:

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

So if table A is all bands, and table B is the bands I hate, then I only want bands I do NOT hate. So the result of a select should be:

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

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

How would I write a single select for this? Here was my last attempt:

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

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

EDIT: The line above has been fixed! See comments below..."= NULL" versus "IS NULL".

编辑:上面的行已修复!请参阅下面的评论...“= NULL”与“IS NULL”。

回答by Barranka

I would use a join

我会使用连接

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

Remember: Create the appropriate indexes for your table

记住:为你的表创建合适的索引

回答by Stephen Fischer

You can use IN, but it's super inefficient:

您可以使用IN,但它的效率非常低:

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

回答by Hyman

SELECT * FROM tableA WHERE id NOT EXISTS (SELECT DISTINCT id FROM tableB)

or

或者

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

回答by user3021515

SELECT BAND FROM A WHERE BAND NOT EXISTS(SELECT DISTINCT HATE FROM B)

OR

或者

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