Переписать несколько правых объединений в левые
Я прочитал это
SELECT * FROM table_0
RIGHT JOIN table_1 ON table_0.col_0 = table_1.col_0;
такой же как:
SELECT * FROM table_1
LEFT JOIN table_0 ON table_0.col_0 = table_1.col_0;
Как мне переписать более длинный запрос, скажем так:
SELECT * FROM table_0
RIGHT JOIN table_1 ON table_1.col_0 = table_0.col_0
RIGHT JOIN table_2 ON table_2.col_1 = table_1.col_1
RIGHT JOIN table_3 ON table_3.col_2 = table_2.col_2;
использовать только левое соединение? Я был бы заинтересован в общем решении такой проблемы.
Я особенно заинтересован в диалекте PostgreSQL, если это имеет значение. Из вывода объяснения я вижу, что простой замены LEFT на RIGHT здесь недостаточно. Запросы возвращают различное количество строк.
1 ответ
Решение
Просто переверните таблицы:
SELECT *
FROM table_3 LEFT JOIN
table_2
ON table_3.col_2 = table_2.col_2 LEFT JOIN
table_1
ON table_2.col_1 = table_1.col_1 LEFT JOIN
table_0
ON table_1.col_0 = table_0.col_0;
LEFT JOIN
сохраняет все таблицы в первой таблице независимо от того, оценивается ли условие как true, false или NULL. RIGHT JOIN
сохраняет все строки во второй таблице независимо от условия.
Я хочу отметить, что это верно для ON
условия, как вы их написали. Это не может быть правдой для всех ON
условия.