我正在Redshift中阅读SQL查询,无法理解最后一部分:
...
LEFT JOIN (SELECT MIN(modified) AS first_modified FROM user) ue
ON 1=1
ON 1=1
在这里意味着什么?
答案 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|
+-+-+