Пример запроса:
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 ...
чтобы пользователь не мог увидеть ошибку, когда / если (возможно, никогда) возникнет эта ситуация, или пусть ошибка возникнет. Я склоняюсь к тому, чтобы не добавлять верхний оператор и не допускать появления ошибки, а не позволять пользователю видеть потенциально неверные данные. Мне интересно, есть ли у кого-нибудь мысли о наилучшей практике в такой ситуации ...