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 展开
test1 有name字段,唯一
test2 有name字段,不唯一.
SELECT name FROM test1
WHERE name NOT IN (SELECT DISTINCT NAME FROM test2 WHERE NAME<>'admin') AS test3 展开
3个回答
展开全部
可以考虑换成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都不影响结果。
展开全部
还要注意是在哪一种数据库管理系统中,有些就不支持minus,不过not exists应该都支持。
追问
except会去重复,不需要DISTINCT吗?
追答
不需要DISTINCT了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
select name from test1 a
where not exists (select * from test2 b where b.name<>'admin' and b.name = a.name)
where not exists (select * from test2 b where b.name<>'admin' and b.name = a.name)
追问
except会去重复,不需要DISTINCT吗?
追答
用exists 或者not exists时不需要DISTINCT
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询