JOIN (SELECT ... ) ue ON 1=1?

JOIN (SELECT ... ) ue ON 1=1?

我正在阅读 Redshift 中的 SQL 查询,但无法理解最后一部分:

...
LEFT JOIN (SELECT MIN(modified) AS first_modified FROM user) ue
ON 1=1

这里的ON 1=1是什么意思?

我相信它用于模拟笛卡尔连接。

从您的查询中,修改最少的值(它将只是 1 个元素)将分配给左侧 table 的所有记录。

PS :左连接在这里用处不大。还不如使用 inner join

它只是在进行交叉连接,它选择第一个 table 中的所有行和第二个 table 中的所有行,并显示为笛卡尔积,即具有所有可能性。

JOIN(LEFT、INNER、RIGHT 等)语句通常需要一个“ON ...”条件。放入 1=1 就像在说“1=1 始终为真,不要消除任何东西".

意图是无条件LEFT JOIN,与不同 a CROSS JOIN 因为从左边的 table 表达式返回所有行,即使在右边的 table 表达式中没有匹配 - 而 CROSS JOIN 从结果。 More on joins in the manual.

但是:

1=1 在 Postgres 中毫无意义 并且 all derivatives including Amazon Redshift. Just use true. This has probably been carried over from another RDBMS that does not support the boolean 正确输入。

... LEFT JOIN (SELECT  ...) ue ON true

然后,LEFT JOIN 对于右边带有 SELECT MIN(modified) FROM user 的特定子查询毫无意义,因为 SELECT 具有聚合函数 (min()) 而没有 GROUP BY 子句总是 returns 恰好一行。这种情况(但不是 可能找不到行 的其他情况)可以简化为:

... CROSS JOIN (SELECT MIN(modified) AS first_modified FROM user) ue

我的回答在 Erwin 的回答之上举例说明。

假设您有三个 tables A1、B1 和 C1(空)

A1 -

+-+
|a|
+-+
|2|
|1|
|3|
+-+

B1 -

+----+
|b   |
+----+
|a   |
|b   |
|c   |
|NULL|
+----+

C1 -

+----+
|c   |
+----+

加入 table A1 和 B1 时,on 1=1 的行为与 CROSS JOIN 相同。

select * from a1 left join b1 on 1=1;
select * from a1 cross join b1;

结果-

+-+----+
|a|b   |
+-+----+
|1|NULL|
|1|a   |
|1|b   |
|1|c   |
|2|NULL|
|2|a   |
|2|b   |
|2|c   |
|3|NULL|
|3|a   |
|3|b   |
|3|c   |
+-+----+

但是,当我们将 A1 与 C1 连接时,您会得到两个不同的结果

select * from a1 left join c1 on 1=1;

结果-

+-+----+
|a|c   |
+-+----+
|1|NULL|
|3|NULL|
|2|NULL|
+-+----+

对于交叉连接 -

select * from a1 cross join c1;

结果-

+-+-+
|a|c|
+-+-+