#sql #sql-server
#sql #sql-сервер
Вопрос:
У меня есть следующий запрос, который содержит несколько условий в одном поле. Он работает нормально, но не уверен, что это правильный способ сделать это.
Я хочу отобразить все транзакции с определенной даты, также, если у клиента есть дата ссылки, тогда игнорируйте транзакции, которые были выполнены до даты ссылки.
DECLARE @Date DATETIME = '2019/03/09 00:01:57.000'
SELECT
f.[OID] ,
f.[CustomerNum] ,
f.[Amount] ,
f.[TransactionDate] ,
cus.Linkdate
FROM [Transaction] f
INNER JOIN dbo.Customer cus ON cus.CusNum = f.CustomerNum AND cus.OID = f.OID
WHERE f.OID = 16 AND f.CustomerNum = 1234
AND f.TransactionDate > @Date
AND f.TransactionDate >= ISNULL(cus.Linkdate,@Date)
Комментарии:
1. Насколько велики ваши данные? Возможно, вы захотите рассмотреть возможность использования временной таблицы для первого отфильтровывания вашей LinkDate, а затем запуска оставшихся предикатов для временных данных.
Ответ №1:
Ваш запрос в порядке, но я предпочитаю формулировать его как:
WHERE f.OID = 16 AND
f.CustomerNum = 1234 AND
f.TransactionDate > @Date AND
(cus.LinkDate IS NULL OR f.TransactionDate >= cus.Linkdate)
Я считаю, что это лучше передает смысл логики.