Sql 不在条款中,有更好的方法吗

Sql 不在条款中,有更好的方法吗,sql,monetdb,Sql,Monetdb,我试图排除以前见过的id号,我的查询是 select id from table1 where date1 >= eDate1 and date1 <= eDate2 and zId = 256 and id no in (select id from table1 where date1 < eDate1 and zId = 256) 从表1中选择id,其中date1>=eDate1和date1一些数据库优化器可以处理一个大的id列表,而另一些数据库优化器不能很好地处理它

我试图排除以前见过的id号,我的查询是

select id from table1 where date1 >= eDate1 and date1 <= eDate2 and zId = 256
and id no in
(select id from table1 where date1 < eDate1 and zId = 256)

从表1中选择id,其中date1>=eDate1和date1一些数据库优化器可以处理一个大的id列表,而另一些数据库优化器不能很好地处理它

最好的方法是在未命中时使用左连接和筛选器:

select a.id
from table1 a
left join table1 b on a.id = b.id and b.date1 < eDate1
where a.date1 between eDate1 and eDate2
and zId = 256
and b.id is null
选择一个id
来自表1 a
在a.id=b.id和b.date1
一些数据库优化器可以处理大量的id列表,而另一些则不能很好地处理它

最好的方法是在未命中时使用左连接和筛选器:

select a.id
from table1 a
left join table1 b on a.id = b.id and b.date1 < eDate1
where a.date1 between eDate1 and eDate2
and zId = 256
and b.id is null
选择一个id
来自表1 a
在a.id=b.id和b.date1
您使用的是哪种DBMS?“更好的方式”?您的问题不清楚。性能更好,查询更快。对不起,这不清楚,戈登。你正在使用哪个数据库管理系统?“更好的方式”?您的问题不清楚。性能更好,查询更快。抱歉,这还不清楚。Gordon。我刚刚读了这篇文章,它说“这就是为什么左JOIN/is NULL查询需要810毫秒,或者是NOT EXISTS/NOT IN查询的3倍。”@flavour404取决于列表的大小。如果它很大,这个查询应该更快。还要注意的是,您需要在
id
列上建立一个索引,我刚刚读过这篇文章,它指出“这就是为什么左JOIN/IS NULL查询需要810毫秒,或者是NOT EXISTS/NOT IN查询的3倍。”@flavour404取决于列表的大小。如果它很大,这个查询应该更快。还请注意,您需要在
id
列上建立索引