一个 SQL 查询的问题

2019-01-12 09:44:12 +08:00
 Laynooor

现在有两张表,2018_word_freqt5000.

两张表有些单词是共有的,我想列出 2018_word_freq 特有的单词。(比如两张表都有 the 这个单词,那么最后查询结果中不会出现这个词)

这是我在 Google Bigquery 上执行的查询语句,但是返回的结果并没有排除重复的项目。

感觉是自己 SQL 没写对,但是网上查了半天,语句改了又改结果还是不正确……

1722 次点击
所在节点    问与答
11 条回复
MOONYANYI
2019-01-12 10:08:56 +08:00
用 inner 查出两张表相同的,再 not in
yasumoto
2019-01-12 10:11:39 +08:00
select wf.* from 2018_word_freq wf where wf.word not in (SELECT word from t5000 where _______word in (wf.word));

select wf.* from 2018_word_freq wf where wf.word not in (SELECT word from 2018_word_freq twf , t5000 t where twf.word = t._______word );

跟楼上的思路一样 不知道是否有更有效的查询方法
lsongiu
2019-01-12 10:17:10 +08:00
我咋感觉 lz 本身的 sql 也能查出来才对呢。难道有空格?
thinkif
2019-01-12 10:17:14 +08:00
是我眼花了么?仅从截图里看,2 个表中的词没有看到重复的
Laynooor
2019-01-12 10:20:08 +08:00
@thinkif 第一个表 2000 个单词。第二个表 5000 个单词,然后截图里显示的没有按词频排序,所以没看到重复的
thinkif
2019-01-12 10:20:59 +08:00
@Laynooor #5
not in
MOONYANYI
2019-01-12 10:21:30 +08:00
还可以用左外连接,再判断右表字段为 null 的
oaix
2019-01-12 10:22:55 +08:00
select a.* from 2018_word_freq a left join t5000 b on a.word = b.______word where b.______word is null

如果你的数据库支持 left anti join 可以使用 select a.* from 2018_word_freq a left anti join t5000 b on a.word = b.______word
thinkif
2019-01-12 10:22:57 +08:00
@Laynooor #5
一不留神发布去了
正常来说,not in / not exists / left join + is not null 这几种写法都可以的
然后如 @lsongiu #3 所说,如果词中有空格干扰也可能出问题,试试 trim 掉空格或换行符之类的试试
Laynooor
2019-01-12 10:43:09 +08:00
@lsongiu 确实是空格的问题,第二个表前面有空格,去掉后就正常了。
qinrui
2019-01-12 12:22:00 +08:00
select word from a left outer join b on a.word=b.word where b.word is null

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

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

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

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

© 2021 V2EX