2015-07-12 76 views
2

,我读了重写多个右连接至左连接

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

回答

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保留的所有表第一表,不管条件是否计算为true,false或NULL。 A RIGHT JOIN保留第二个表中的所有行,而不管条件如何。

我想说明的是,在您写下它们的ON条件下,情况也是如此。对于所有ON条件可能并非如此。