首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >选择返回未出现在任何行中的值的列表

选择返回未出现在任何行中的值的列表
EN

Stack Overflow用户
提问于 2012-04-04 22:42:23
回答 5查看 39.9K关注 0票数 40

查询:

select id from users where id in (1,2,3,4,5)

如果users表包含ids 1、2、3,这将返回1、2和3。我希望查询返回4和5。换句话说,我不希望查询返回表中存在的任何行,我希望为其提供一个数字列表,并从该列表中获取表中未出现的值。

(更新以澄清以下几个不适用的答案)

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-04-04 22:50:29

给定的数字是一个固定的列表。我能想到的最快的方法是有一个测试表,填充这些数字,然后做

未经测试的select语句-但您将遵循princpal。

select test.number 
from test 
left join 
    users 
on 
    test.number = users.id 
where test.number <> users.id

然后,您将获得没有匹配user.id的所有数字,因此可以填充空洞。

票数 16
EN

Stack Overflow用户

发布于 2014-11-21 11:26:59

如果你不想(显式地)使用临时表,这是可行的:

SELECT id FROM (
  (SELECT 1 AS id) UNION ALL
  (SELECT 2 AS id) UNION ALL
  (SELECT 3 AS id) UNION ALL
  (SELECT 4 AS id) UNION ALL
  (SELECT 5 AS id)
) AS list
LEFT JOIN users USING (id)
WHERE users.id IS NULL

然而,它非常丑陋,非常长,如果ID列表很长,我怀疑它会如何执行。

票数 21
EN

Stack Overflow用户

发布于 2013-04-20 00:22:41

也有同样的需求,并基于BugFinder在会话中使用临时表的答案构建。通过这种方式,它将在我完成查询后自动销毁,因此我不必处理房屋清理,因为我将经常运行这种类型的查询。

创建临时表:

CREATE TEMPORARY TABLE tmp_table (id INT UNSIGNED);

使用要检查的值填充tmp_table:

INSERT INTO tmp_table (id) values (1),(2),(3),(4),(5);

创建并填充表后,像任何常规表一样运行查询:

SELECT tmp_table.id
  FROM tmp_table
  LEFT JOIN users u
  ON tmp_table.id = u.id
  WHERE u.id IS NULL;

This info on MySQL Temporary Tables was also useful

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10013475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档