给定一组数据,怎样找出数据库里没有的

2017-03-31 10:48:43 +08:00
 AnonymousAccout
比如我这有一组学号,用 select * from table where in 来查找, in 里面有 50 个学号,但是 select 出来只有 40 个,我改如何找出在数据库中不存在的学号呢,先谢谢大家了
3417 次点击
所在节点    MySQL
16 条回复
bbao
2017-03-31 11:00:26 +08:00
还是放原题吧
AnonymousAccout
2017-03-31 11:04:28 +08:00
@bbao 就是这样的需求,别人扔了个 excel 过来,里面一组学号,然后要在一个表里查哪个学号不存在 Orz
ivvei
2017-03-31 11:05:28 +08:00
集合减。
minus 的语法 MySQL 没实现,可以用 left join 来做。
ivvei
2017-03-31 11:06:49 +08:00
或者 not in 可以。但是你都得构造 50 个学号的一个集合。
ivvei
2017-03-31 11:08:09 +08:00
我在 3 楼多敲了个 left
ivvei
2017-03-31 11:11:12 +08:00
在 4 楼少敲了个“也”。 在 5 楼只打出了半句话…… 还有半句是“却没有敲出后面要用条件删选”, 我这特么都醉了……
AnonymousAccout
2017-03-31 11:11:12 +08:00
@ivvei not in 的话是 select from 构建的集合 not in 实际的表 这样做吗
ivvei
2017-03-31 11:13:26 +08:00
@AnonymousAccout 是。 select 一条条记录 union 起来,或者你直接把 excel 数据插入一个表,然后 select 那个表,这样写起来省点事。然后 not in 你要对比的表。
billgreen1
2017-03-31 11:14:46 +08:00
SELECT
*
FROM table1 t1
LEFT JOIN table2 t2 ON t1.id = t2.id
WHERE t2.id IS NULL
Immortal
2017-03-31 11:18:43 +08:00
not in 不就好了
既然你自己说 in 能从 50 几个里查到 40 几个 剩下的就是不存在的
neilwong
2017-03-31 11:56:41 +08:00
工作中遇到过类似的问题,后来解决的方案是:

先做一次初始化,然后把有的数据更新,最后查未更新过的。

解决方案非常不优化,但胜在快速简单...
liuxin5959
2017-03-31 22:54:13 +08:00
请独立完成作业。
AnonymousAccout
2017-04-01 07:59:08 +08:00
@liuxin5959 不是作业啊😂
mingl0280
2017-04-01 09:08:18 +08:00
@Immortal 你这个错了, NOT IN 是数据库中存在但不匹配 IN 列表的项。
@AnonymousAccout 全部 Select 出来做个哈希表比对下就行了。
AnonymousAccout
2017-04-01 10:19:17 +08:00
这属于差集运算 最后得出还是左连接 + is null 效率最高
Immortal
2017-04-01 11:24:51 +08:00
@mingl0280 你说的对的 是我没过大脑 第一反应

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/351690

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX