0

能不能用 SQL 查出没有在数据表里出现的值

 1 year ago
source link: https://www.v2ex.com/t/930970
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

V2EX  ›  问与答

能不能用 SQL 查出没有在数据表里出现的值

  yuann72 · 6 小时 9 分钟前 · 699 次点击

一个数据表只有一个 name 列, 这个数据表只有两行, 分别是 A 和 B 。

name
A
B

现在有几个数据,分别是 A,B,C,D ,有没有办法使用 SQL 语句查出 A,B,C,D 这 4 个中哪些没有出现在数据表里?
按我举的这个例子,最后应该输出 C 和 D

17 条回复    2023-04-09 19:22:00 +08:00
yuann72

yuann72      6 小时 6 分钟前

我问了 chatGPT ,它完全没理解我的意思😅


可以使用 SQL 中的 NOT IN 子句来解决这个问题。具体地,可以写出如下的 SQL 语句:
SELECT name FROM table_name WHERE name NOT IN ('A', 'B', 'C', 'D');
其中,table_name 是要查询的数据表名,name 是列名,'A', 'B', 'C', 'D' 是要查询的字符串值。这个语句会返回那些在数据表中没有出现的 name 值。

在你举的例子中,执行这个语句会得到以下结果:
C
D
因为 C 和 D 没有出现在这个数据表中。
Ambition95

Ambition95      5 小时 32 分钟前

把 abcd 搞成表 t1 ,假设原表是 t2
select
*
from t1
left anti join t2
on t1.name = t2.name
tomczhen

tomczhen      5 小时 27 分钟前 via Android

按集合的概念来描述就应该能理解了。
Biggoldfish

Biggoldfish      5 小时 26 分钟前 via Android

WHERE NOT IN 就行吧
yjim

yjim      5 小时 6 分钟前

你这个需求脱离 SQL 实现方便点,如果一定要用 SQL 来执行的话,了解下存储过程
xiangyuecn

xiangyuecn      4 小时 48 分钟前   ❤️ 1

牛逼到不行的 union all ,轻松构造多行数据

select name from

(
select 'A' as name
union all select 'B' as name
union all select 'C' as name
union all select 'D' as name
) as List

where name not in(
-- select name from 你的表
(
select 'A' as name
union all select 'B' as name
)
)
akira

akira      4 小时 17 分钟前

SQL 查有不查无。
构建一个 临时表 放好 ABCD ,然后再来做这个事情 就简单了。
yuann72

yuann72      4 小时 4 分钟前

@Ambition95 #2
@hahastudio #3
@yjim #6
@Hurriance #7
@xiangyuecn #8
有时会需要临时查下一批数据中哪些没有出现在表里。
目前的做法确实是用 SQL 以外的方式实现,但不够方便,就是把表的数据查出来复制到 EXCEL 里进行对比,有些麻烦,数据表里只有几千行还行,要是大几万行就更麻烦。
通过创建临时表的方式也行但也不够方便,建表>插入数据>查询完>删表,而且如果是在生产环境里查,生产环境里也不给建临时表啊
yuann72

yuann72      4 小时 3 分钟前

SQL 里有没有这种函数:可以传入任意个参数,自动转成一张临时表。
这样就能用这张临时表来 JOIN 或者 NOT IN 查询了
yjim

yjim      3 小时 48 分钟前

@yuann72 你这几万行数据指的是有几万个不同的 name ?还是指有几万条 name 数据,但是来来去去就那么几个值?

如果是后者可以用 select distinct(name) from table 去重。
lower

lower      3 小时 43 分钟前

布隆过滤?
yjim

yjim      3 小时 43 分钟前

@yuann72 建表>插入数据>查询完>删表 你这一套方法用存储过程,不需要建表也可以完成,而且写一次存储过程下次直接在数据库里调用就可以获得检查结果了。 缺点是存储过程的写法和坑实在让人蛋疼。好处嘛,一次写完下次直接跑就行了。
akira

akira      3 小时 41 分钟前

生产环境 单独加一个库 专门用来放这种临时需求的表数据。
而且这种查询的表 你可以保留下来,不做删除,方便后续回查。

如果你们有数仓的话,这类查询放数仓就更方便了。
awen233333

awen233333      3 小时 27 分钟前 via iPhone

@yuann72 表值函数返回 ABCD ,然后用 minus 运算符减去 AB
fackVL

fackVL      几秒前 via iPhone

感觉你走两个极端了,人家说另外的方式不是说导出来用 Excel 。可以试试用代码实现啊

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK