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

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

SELECT name FROM test1
WHERE name NOT IN (SELECT DISTINCT NAME FROM test2 WHERE NAME<>'admin') AS test3
最新回答
伪装者

2024-11-23 08:02:37

可以考虑换成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都不影响结果。
追问
SELECT name FROM test1 a
minus
SELECT DISTINCT NAME FROM test2 WHERE NAME'admin'
这个查询中DISTINCT无意义,可以去掉.是吗(test2 有name字段,不唯一)
追答
可以去掉
姐媞仼,领迗丅

2024-11-23 08:43:35

还要注意是在哪一种数据库管理系统中,有些就不支持minus,不过not exists应该都支持。
追问
except会去重复,不需要DISTINCT吗?
追答
不需要DISTINCT了
紫珺婳浅

2024-11-23 08:43:02

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