Добавление строго бизнес-логических предикатов к условиям LEFT JOIN - PullRequest
0 голосов
/ 18 мая 2011

Это запрос теоретической / передовой практики для получения мнений.

Я привык рассматривать предложение WHERE и условия JOIN как хорошее место для "размещения" любой бизнес-логики, которая сделает мой запрос более точнымнасколько это возможно.

Но мое внимание привлекло то, что добавление несвязанной бизнес-логики в качестве условия JOIN может противоречить "лучшим практикам".Например:

         SELECT a.Id, b.Id
           FROM foo AS a 
LEFT OUTER JOIN bar AS b ON a.Id = b.Id 
                        AND GETDATE() >= "18/5/2011"

Пример немного наивен: в реальной жизни вызывающему действительно требуется дополнительное условие, и отсутствие его действительно приведет к неверному результату (что вызывающий должен будет фильтровать вcode).

Обратите внимание, что при соединениях OUTER и когда этого требует логика, размещение условия в предложении WHERE не является возможным.

1 Ответ

0 голосов
/ 19 мая 2011

Я всегда практиковал, когда по этой причине в операторы JOIN ставим столько условных выражений, сколько возможно по этой причине, и читал во многих местах, в том числе в трудах Джо Селко, что это лучший способ сделать это.

JOIN условия будут быстрее, поскольку они исключают добавление строк в объединенную таблицу в целом, где условие WHERE используется после объединения таблиц на основе условий объединения - и, возможно, на намного больший набор данных. Я уверен, что во многих случаях оптимизатор справляется с этим разумно и применяет условия ГДЕ, где это возможно, но это предположение, и оно в лучшем случае будет зависеть от конкретного двигателя.

...