Я знаю, что вы сказали, что EndDate
столбец должен позволить NULL
, так только для записи: самый эффективный способ прекратить использование NULL
сек вместо «без даты окончания» в IdentificationType
таблицы, и вместо этого использовать 9999-12-31
. Тогда ваши запросы могут пропустить всю статью OR
. (Я понимаю, что для этого могут потребоваться некоторые изменения в приложении, но, на мой взгляд, это было бы полезно для этой причины , а именно: причина - и я видел, что этот шаблон «NULL = открытый конец» затрудняет выполнение запросов или повторяется снова и снова . моя работа и в вопросах SQL онлайн)
Кроме того, вы могли бы рассмотреть изменения порядка двух OR
условиях - это может звучать как вуду, но я считаю, я слышал, что есть какие-то особые случаи, когда он может оптимизируйте лучше, когда переменная будет первой в этом конкретном сценарии (хотя я могу ошибаться).
А пока вы попробуете это и расскажете, насколько хорошо он работает по сравнению с вашими и другими решениями?
SELECT
CustomerNumber, IdentificationNumber
FROM
dbo.Identification i
INNER JOIN dbo.IdentificationType it
ON it.IdentificationType = i.IdentificationType
WHERE
it.EffectiveDate < @TodaysDate
AND it.EndDate IS NULL
UNION ALL
SELECT
CustomerNumber, IdentificationNumber
FROM
dbo.Identification i
INNER JOIN dbo.IdentificationType it
ON it.IdentificationType = i.IdentificationType
WHERE
it.EffectiveDate < @TodaysDate
AND it.EndDate > @TodaysDate
;
я поправилась от плохой работы с OR
пунктами, используя эту точную стратегию. Вроде бы больно взорвать размер запроса/сложность, но возможность получить только несколько запросов полностью стоит того, что вы скачали сейчас.
В ваших сравнениях неравенства есть что-то подозрительное: первый должен иметь знак равенства в нем <=
. Вы не указали нам тип данных столбцов даты и @TodaysDate
, но лучше всего разработать систему, чтобы она не прерывалась для любого ввода. Поэтому, даже если переменная datetime
и EffectiveDate
не имеет временной части, она должна быть <=
при таком сравнении, поэтому запрос точно в полночь не преминет включить данные за этот день.
P.S. Извините, что не сохраняю форматирование. Я просто понимаю запросы лучше, когда отформатирован в моем предпочтительном стиле. Кроме того, я переместил условия даты в пункт WHERE
, потому что, по моему мнению, они не являются частью JOIN
.
Какая версия SQL Server? – ErikE
Не могли бы вы показать план выполнения, пожалуйста? –
Извините, SQL Server 2008R2 – ganders