当前位置:  开发笔记 > 数据库 > 正文

我应该在SubQuery中使用Top(1)吗?

如何解决《我应该在SubQuery中使用Top(1)吗?》经验,为你挑选了1个好方法。

示例查询:

select * 
from A join B on A.ID = B.SOMEVALUE
where A.VALUE="something" and
B.ID = 
       (select ID from B where SOMEVALUE = A.ID and 
              THISDATE = (select max(SOMEDATE) from B where ...))

因此,如果您可以阅读SQL,您应该看到我正在做一些相关的子查询来缩小连接的结果.(是的,这非常简化).

在某些情况下子查询:

select ID from B where SOMEVALUE = A.ID and 
    THISDATE = (select max(SOMEDATE) from B where ...)

可以返回多于1个值,这会导致错误

"子查询返回的值超过1.当子查询跟随=,!=,<,<=,>,> =或子查询用作表达式时,不允许这样做."

我完全期待.这显然不是一件好事,我有代码(希望)防止这些重复项首先进入数据库(即表B 应该只有1行匹配

SOMEVALUE = A.ID and max(SOMEDATE)

然而,最终用户如果没有创造性,却找不到破解软件的方法.

所以现在我的问题:

将第一个子查询更改为更好

select top 1 * from B ...

当/如果(希望永远不会)出现这种情况或让错误通过时,防止用户看到错误.我倾向于不添加top语句并让错误通过而不是让用户看到可能不正确的数据.我想知道在这种情况下是否有人对最佳实践有任何想法......



1> John..:

通常TOP 1是个好主意.

考虑一个包含数百万行的大型表,在您匹配的列上没有索引,但是您只需查找单行.

SELECT TOP 1表示一旦找到一个项目,表扫描就会停止.

如果没有TOP 1,表扫描将一直持续到最后.

与涉及扫描(或蛮力)进行搜索的任何事情一样.使用TOP 1,它应该比不使用TOP 1快50%.

但是,根据您需要返回的内容,通常可以使用EXISTS实现真正的性能提升.

而不是写作

SELECT * FROM table t
WHERE t.id = (SELECT TOP 1 foreignid from table2)

您可以使用

SELECT * FROM table t
WHERE EXISTS (SELECT 1 from table2 WHERE foreignid = t.id)

推荐阅读
乐韵答题
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有