Переписать несколько правых объединений в левые

Я прочитал это

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 условия.

Другие вопросы по тегам