示例查询:
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 个值,这会导致错误
“子查询返回的值超过 1 个。当子查询跟随 =、!=、<、<=、>、>= 或将子查询用作表达式时,这是不允许的。”
我完全期待。这显然不是一件好事,我有代码(希望)首先防止这些重复项进入数据库(即表 B应该只有 1 行与
SOMEVALUE = A.ID and max(SOMEDATE)
标准),但是最终用户如果没有创造性地寻找我想不出的破坏软件的方法,那将一事无成。
所以现在我的问题:
将第一个子查询更改为
select top 1 * from B ...
防止用户在/如果(希望永远不会)出现这种情况时看到错误,或者让错误发生。我倾向于不添加顶部语句并让错误出现,而不是让用户看到可能不正确的数据。我想知道在这种情况下是否有人对最佳实践有任何想法......