重写多个右连接到左连接

时间:2015-07-12 13:53:36

标签: sql postgresql left-join relational-algebra right-join

我读了那个

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;

仅使用LEFT JOINS?我会对这种问题的通用解决方案感兴趣。

如果它确实重要,我对PostgreSQL方言特别感兴趣。 从解释输出中我可以看到,简单地将LEFT替换为RIGHT在这里是不够的。查询返回不同的行数。

1 个答案:

答案 0 :(得分: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;

LEFT JOIN将所有表保留在 first 表中,无论条件是否为true,false或NULL。无论条件如何,RIGHT JOIN都会保留第二个表中的所有行。

我想要注意,对于ON条件,这是正确的。对于所有ON条件,情况可能并非如此。