Я читаю SQL-запрос в Redshift и не могу понять последнюю часть:
...
LEFT JOIN (SELECT MIN(modified) AS first_modified FROM user) ue
ON 1=1
Что означает ON 1=1
?
Я читаю SQL-запрос в Redshift и не могу понять последнюю часть:
...
LEFT JOIN (SELECT MIN(modified) AS first_modified FROM user) ue
ON 1=1
Что означает ON 1=1
?
Он просто выполняет перекрестное соединение, которое выбирает все строки из первой таблицы и все строки из второй таблицы и отображает их как декартово произведение, т.е. со всеми возможностями.
Операторы JOIN (ВЛЕВО, ВНУТРЕННИЙ, ПРАВЫЙ и т.д.) Обычно требуют условия "ON...". Ввод 1 = 1 - это все равно, что сказать "1 = 1 всегда верно, ничего не устранять".
Намерение является безусловным LEFT JOIN
, которое отличается от от CROSS JOIN
тем, что возвращаются все строки из левого табличного выражения, даже если в правом табличном выражении нет совпадений - в то время как CROSS JOIN
отбрасывает такие строки из результата. Подробнее о соединениях в руководстве.
Тем не менее:
1=1
бессмысленно в Postgres и всех производных, включая Amazon Redshift. Просто используйте true
. Это, вероятно, было перенесено из другой СУБД, которая не поддерживает должным образом тип boolean
.
... LEFT JOIN (SELECT ...) ue ON true
С другой стороны, LEFT JOIN
не имеет смысла для этого конкретного подзапроса с SELECT MIN(modified) FROM user
справа, потому что SELECT
с агрегатной функцией (min()
) и без предложения GROUP BY
всегда возвращает ровно одну строку. Этот случай (но не другие случаи, когда не может быть найдена строка) можно упростить до:
... CROSS JOIN (SELECT MIN(modified) AS first_modified FROM user) ue
Я считаю, что его использовали для подражания декартовому соединению.
Из вашего запроса наименее измененное значение (Оно будет всего одним элементом) будет назначено всем записям левой таблицы.
PS: левое соединение здесь не очень полезно. Возможно также просто использовать внутреннее соединение