3

我读到了

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 是不够的。查询返回不同数量的行。

4

1 回答 1

4

只需反转表格:

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;

ALEFT JOIN将所有表保留在第一个表中,无论条件计算结果为 true、false 还是 NULL。无论条件如何, ARIGHT JOIN都会保留第二个表中的所有行。

我想指出,这对于ON您编写的条件是正确的。它可能不适用于所有ON条件。

于 2015-07-12T13:56:44.553 回答