sql语句求优化,听说NOT IN 语句不好求优化

有两个表test1有name字段,唯一test2有name字段,不唯一.SELECTnameFROMtest1WHEREnameNOTIN(SELECTDISTINCTN... 有两个表
test1 有name字段,唯一
test2 有name字段,不唯一.

SELECT name FROM test1
WHERE name NOT IN (SELECT DISTINCT NAME FROM test2 WHERE NAME<>'admin') AS test3
展开
 我来答
frogley
2013-09-26 · TA获得超过1854个赞
知道小有建树答主
回答量:1008
采纳率:50%
帮助的人:1081万
展开全部

可以考虑换成not exists或minus(except)

--not exists
SELECT name FROM test1 a
WHERE NOT EXISTS (SELECT 1 FROM test2 b WHERE a.NAME=b.NAME and b.NAME<>'admin')
--minus
SELECT name FROM test1 a
minus
SELECT DISTINCT NAME FROM test2 WHERE NAME<>'admin'

效率方面,一般来说not exists和minus要比not in强很多,但是也要具体情况具体分析。

可以参考这里:http://blog.csdn.net/msg_java2011/article/details/6565198

通过一个例子,对比几种方法的效率

更多追问追答
追问
except会去重复,不需要DISTINCT吗?
追答
except是第一张表减去第二张表。你第一张表里name不是唯一的吗,所以不用distinct。第二张表是否distinct都不影响结果。
阿冬76
2013-09-26 · TA获得超过5028个赞
知道大有可为答主
回答量:2710
采纳率:88%
帮助的人:1097万
展开全部
还要注意是在哪一种数据库管理系统中,有些就不支持minus,不过not exists应该都支持。
追问
except会去重复,不需要DISTINCT吗?
追答
不需要DISTINCT了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
一支红缨枪
2013-09-26 · 超过26用户采纳过TA的回答
知道答主
回答量:54
采纳率:100%
帮助的人:42.2万
展开全部
select name from test1 a
where not exists (select * from test2 b where b.name<>'admin' and b.name = a.name)
追问
except会去重复,不需要DISTINCT吗?
追答
用exists 或者not exists时不需要DISTINCT
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式