access中使用sql语句not in效率太低,有没有效率高的办法啊?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了access中使用sql语句not in效率太低,有没有效率高的办法啊?相关的知识,希望对你有一定的参考价值。
select count(sfzsy) from jhdk1 where sfzsy not in(select sfzsy from sbdk1)
jhdk1和sbdk1两张表都分别有6万多条记录,但该句sql语句在access的查询中要运行很长时间,有没有效率高些的办法啊?
谢谢各位!
同样的语句,同样的数据量在UNIX下的isql运行只要不到1秒钟,access的效率怎么这么低啊?
要求一定要在access下做,没办法啊,在语句上有没有什么可以改进的地方?
看来是语句原因,not in的效率果然够低,换成一下语句后效率很高,也是1秒钟不到执行完毕
SELECT count(sfzsy) FROM jhdk1 WHERE not exists(select * from sbdk1 where sbdk1.sfzsy = jhdk1.sfzsy);
有没有办法在 SQL 中将 EXCEPT 语句重写为 NOT IN 语句?
【中文标题】有没有办法在 SQL 中将 EXCEPT 语句重写为 NOT IN 语句?【英文标题】:Is there a way to rewrite EXCEPT statements into NOT IN statements in SQL? 【发布时间】:2015-04-23 08:07:03 【问题描述】:我已经学习了几个星期的 SQL,并且刚刚完成了关于使用 IN 和 NOT IN 的家庭作业问题。我设法得到了正确的答案,但是,我使用了 EXCEPT 子句,我们还没有真正允许使用它。据我所知,EXCEPT 和 NOT IN 是 SQL 中非常相似的语句,但我不明白有什么区别。这是我的查询的一般格式:
SELECT *
FROM table
WHERE x IN (
SELECT x
/* ... some subquery*/
EXCEPT
SELECT x
/* ... some other subquery*/
)
有没有办法在不使用 EXCEPT 语句的情况下重写这个通用查询?一般而言,EXCEPT 和 NOT IN 有何不同?
编辑:This other post 似乎有一些很好的信息,但它似乎专注于 EXISTS 而不是 IN,它们有不同的目的不是吗?
【问题讨论】:
【参考方案1】:这可能会帮助您了解 except 和 NOT IN 之间的区别
EXCEPT 运算符返回左侧表中不存在于右侧表中的所有不同行。
另一方面,“NOT IN”将返回左侧表中不存在于右侧表中的所有行,但不会从结果中删除重复行。
【讨论】:
有道理!非常感谢!【参考方案2】:SQL 是一种声明性语言。因此,有许多构造可以转换为相同的关系代数树/执行计划。例如,您可以使用 INNER JOIN 或 CROSS JOIN + WHERE 或 , + WHERE 或 LEFT/RIGHT JOIN + WHERE 指定内连接。
EXCEPT/INTERSECT 是集合运算符,而 IN/NOT IN 是谓词。考虑你的例子,
SELECT *
FROM table
WHERE x IN (
SELECT x
/* ... some subquery*/
EXCEPT
SELECT x
/* ... some other subquery*/
)
这可以用 IN / NOT IN 写成:
SELECT *
FROM table as t1
WHERE t1.x IN (
SELECT t2.x
FROM t2
WHERE t2.x NOT IN (
SELECT t3.x
FROM t3
)
)
现在,就语法而言,它们的含义相同,但在语义上它们可能不会产生相同的结果。例如,如果 X 列可以为空,则 NOT IN 将产生不同的结果。
最后,对于简单的情况,如果您查看 SQL Server Management Studio 中这两个查询的执行计划,您会发现它们使用相似的计划/连接策略。这是因为 SQL Server 会将语法转换为经过优化以生成执行计划的关系树。在此翻译之后,不同查询的最终计划可能相同。
【讨论】:
以上是关于access中使用sql语句not in效率太低,有没有效率高的办法啊?的主要内容,如果未能解决你的问题,请参考以下文章