gpt4 book ai didi

sql - 我应该在子查询中使用 Top(1)

转载 作者:行者123 更新时间:2023-12-03 18:18:46 24 4
gpt4 key购买 nike

示例查询:

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,您应该会看到我正在执行几个相关的子查询来缩小 join 的结果。 (是的,这过于简单化了)。

在某些情况下,子查询:
select ID from B where SOMEVALUE = A.ID and 
THISDATE = (select max(SOMEDATE) from B where ...)

可以返回 1 个以上的值,这会导致错误

"Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression."



我完全期待。这显然不是一件好事,我有代码来(希望)首先防止这些重复项进入数据库(即表 B 应该只有 1 行与
SOMEVALUE = A.ID and max(SOMEDATE)

标准),但是最终用户在寻找我无法想到的破坏软件的方法方面没有创造力。

所以现在我的问题:

将第一个子查询更改为
select top 1 * from B ...

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

最佳答案

通常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)

关于sql - 我应该在子查询中使用 Top(1),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/496070/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com