示例查询:
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语句并让错误通过而不是让用户看到可能不正确的数据.我想知道在这种情况下是否有人对最佳实践有任何想法......
通常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)