将多个右连接重写为左连接
Rewrite multiple right joins to left joins
我读到
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 是不够的。查询 return 不同的行数。
只需反转 tables:
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;
A LEFT JOIN
将所有 table 保留在 第一个 table 中,无论条件的计算结果是真、假还是无效的。 RIGHT JOIN
保留第二个 table 中的所有行,而不管条件如何。
我想指出,这对于您所写的 ON
条件是正确的。它可能不适用于所有 ON
条件。
我读到
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 是不够的。查询 return 不同的行数。
只需反转 tables:
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;
A LEFT JOIN
将所有 table 保留在 第一个 table 中,无论条件的计算结果是真、假还是无效的。 RIGHT JOIN
保留第二个 table 中的所有行,而不管条件如何。
我想指出,这对于您所写的 ON
条件是正确的。它可能不适用于所有 ON
条件。