表中不存在的行

Posted

技术标签:

【中文标题】表中不存在的行【英文标题】:Rows which do not exist in a table 【发布时间】:2015-06-24 09:53:28 【问题描述】:

我有一个姓名列表John、Rupert、Cassandra、Amy,我想获取表中不存在的姓名:Cassandra、Amy

我应该如何编写这样的查询?

我的桌子:

+----+--------+-----------+------+
| id | name   | address   | tele |
+----+--------+-----------+------+
|  1 | Rupert | Somewhere | 022  |
|  2 | John   | Doe       | 029  |
|  3 | Donald | Armstrong | 021  |
|  4 | Bob    | Gates     | 022  |
+----+--------+-----------+------+

【问题讨论】:

这有点不具体。你想达到什么目标? Cassandra, Amy 这些名称存储在哪里? 只需运行一个查询迭代名称并将它们与您要识别的名称列表进行比较? 我想获取数据库中不存在的名称,然后将它们插入这些表和其他表中。现在我在java中这样做 C_B,我在 java 中执行此操作,但我希望 mysql 执行此操作。 (select * from users where name in (John, Rupert, Cassandra, Amy) 并且他们在 java 中比较 【参考方案1】:

分组思考。使用 UNION ALL 将名称添加到结果集中,使用 EXCEPT 从结果集中删除名称。

select 'John'
union all
select 'Rupert'
union all
select 'Cassandra'
union all
select 'Amy'
except
select name from mytable;

【讨论】:

您可以将union 替换为简单的values () 子句:values ('John'), ('Rupert'), ('Cassandra'), ('Amy') except ... @a_horse_with_no_name:你是对的。我根本不知道 values 子句。一个漂亮的解决方案。【参考方案2】:

建立一个您的姓名列表以检查并左连接users 表:

with to_check (name) as (
   values 
     ('John'), ('Rupert'), ('Cassandra'), ('Amy')
)
select tc.name as missing_name
from to_check tc
  left join the_table tt on tt.name = tc.name
where tt.name is null;

SQLFiddle 示例:http://sqlfiddle.com/#!15/5c4f5/1

【讨论】:

【参考方案3】:

希望您的列表采用表格形式,让它成为表格 b,您的原始表格作为 a 现在 SQL 查询就这样了

从a中选择名称,其中名称不在(从b中选择名称);

根据我的理解,这将为您提供解决方案。另外,如果需要更多详细信息,请发表评论。

此外,搜索答案也更重要,因为它看起来像是来自书籍/课程的问题。请尝试找到解决方案可能有更多信息,如下面的链接

How to write "not in ()" sql query using join

【讨论】:

我认为您需要在查询中使用不同的关键字 是的,你是对的,但这只会使查询运行更多的时间。我完全同意你的最佳做法是使用不同的按键

以上是关于表中不存在的行的主要内容,如果未能解决你的问题,请参考以下文章

如何不选择其他表中不存在的行

MYSQL - 仅当 LEFT JOIN 中的行不存在时才选择

如何从一个表中获取另一表中不存在的行

MYSQL 返回其他数据库表中不存在的行 ID 列表

如果其他表中不存在 id,则获取不同的行并使用合并

删除一个表中存在而另一个表中不存在的数据?