Я предпочитаю иметь какие-либо жестко закодированные критерии в соединении. Это делает SQL намного более читабельным и переносимым.
Дискретность:
Вы можете точно увидеть, какие данные вы собираетесь получить, потому что все критерии таблицы записаны прямо в соединении. В больших утверждениях критерии могут быть скрыты в 50 других выражениях, и их легко пропустить.
Портативность:
Вы можете просто скопировать кусок из предложения FROM и вставить его в другое место. Это дает объединения и любые критерии, которые вам нужны. Если вы всегда используете эти критерии при объединении этих двух таблиц, то размещение их в соединении является наиболее логичным.
Например:
FROM
table1 t1
JOIN table2 t2_ABC ON
t1.c1 = t2_ABC.c1 AND
t2_ABC.c2 = 'ABC'
Если вам нужно вытащить второй столбец из таблицы 2, просто скопируйте этот блок в Блокнот, выполните поиск / переопределение «ABC» и Presto и весь новый блок кода, готовый для вставки обратно.
Дополнительно:
Также легче переключаться между внутренним и внешним объединением, не беспокоясь о каких-либо критериях, которые могут присутствовать в предложении WHERE.
Я резервирую предложение WHERE строго для критериев времени выполнения, где это возможно.
Что касается эффективности:
Если вы имеете в виду скорость исключения, то, как все говорили, это избыточно.
Если вы имеете в виду более простую отладку и повторное использование, тогда я предпочитаю вариант 1.