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

时间:2016-02-13 01:08:18

标签: sql postgresql join left-join amazon-redshift

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

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

ON 1=1在这里意味着什么?

4 个答案:

答案 0 :(得分:22)

目的是无条件 LEFT JOIN,它与来自CROSS JOIN 不同 即使右表表达式中没有匹配项,也会返回左表表达式 - 而CROSS JOIN会从结果中删除此类行。 More on joins in the manual.

然而:

Postgres中的

1=1毫无意义,包括Amazon Redshift在内的all derivatives。只需使用true即可。这可能是从另一个不能正确支持boolean类型的RDBMS中继承的。

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

然后,LEFT JOIN对于此右侧有SELECT MIN(modified) FROM user的特定子查询毫无意义,因为SELECT具有聚合函数(min())且没有{{1子句总是只返回一行。这种情况(但不是其他可能找到 没有行 的情况)可以简化为:

GROUP BY

答案 1 :(得分:7)

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

JOIN(LEFT,INNER,RIGHT等)语句通常需要'ON ...'条件。输入1 = 1就像说“1 = 1总是如此,不要消除任何东西”。

您可以将查询重写为

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

得到相同的结果

答案 2 :(得分:4)

我相信它曾经模仿笛卡尔联盟。

从您的查询中,最小修改后的值(仅为1个元素)将分配给左表的所有记录。

PS :左连接在这里没什么用处。不妨使用内连接

答案 3 :(得分:0)

我的答案以一个例子来说明Erwin的答案。

假设您有三个表A1,B1和C1(空)

A1-

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

B1-

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

C1-

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

连接表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|
+-+-+