什么意思是“表A左外连接表B ON TRUE”?

时间:2014-02-03 05:05:26

标签: sql join

我知道在表格加入中使用了条件。但我遇到了一个特定的情况,SQL代码写得像“Table A join table B ON TRUE

基于“ON TRUE”条件会发生什么?这只是一个没有任何条件选择的完全交叉连接吗?

实际上,原始表达式如下:

Table A LEFT outer join table B on TRUE

假设A有m行,B有n行。 “left outer join”和“on true”之间是否存在冲突?因为看起来“真实”会导致交叉连接。

根据我的猜测,结果将是m * n行。所以,它没有必要写“左外连接”,只是一个“连接”会给出相同的输出,对吗?

感谢!!!

4 个答案:

答案 0 :(得分:9)

是。这与CROSS JOIN相同。

在MySQL中,您实际上可以省略CROSS关键字以及ON子句。

ON子句中的谓词只是被评估为布尔值,所以它也可以被写成例如为ON 1=1


更新:

(注意:问题已修改,添加有关a LEFT [OUTER] JOIN b的问题,而不是原始问题:a JOIN b

LEFT [OUTER] JOIN”略有不同,因为右表中没有匹配的行,左侧表格中的行将是偶数。

如您所知,表格 a (包含 m 行)与表 b 之间的CROSS JOIN包含 n 没有任何其他谓词的行将生成 m * n 行的结果集。

在表 b 包含0行的特殊情况下,LEFT [OUTER] JOIN会生成不同的结果集。

CREATE TABLE a (i INT);
CREATE TABLE b (i INT);
INSERT INTO a VALUES (1),(2),(3);

SELECT a.i, b.i FROM a LEFT JOIN b ON TRUE ;

请注意,即使表b包含0行,LEFT JOIN也会返回表a中的行(总共 m 行)。

答案 1 :(得分:2)

交叉连接在两个表之间生成笛卡尔积,返回所有行的所有可能组合。它没有on条款,因为你只是将所有内容都加入到所有内容中。

交叉连接不会合并行,如果每个表中有100行与1比1匹配,则得到10.000结果,Innerjoin在相同情况下只返回100行。

这两个例子将返回相同的结果:

交叉加入

select * from table1 cross join table2 where table1.id = table2.fk_id

内部联接

select * from table1 join table2 on table1.id = table2.fk_id

使用最后一种方法

答案 2 :(得分:1)

join语法的一般形式:

SELECT *
FROM   table_a
JOIN   table_b ON condition

condition用于告诉数据库如何匹配table_atable_b的行,通常看起来像table_a.some_id = table_b.some_id

如果您只是指定true,则会将table_a中的每一行与table_b的每一行匹配,因此如果table_a包含n行且table_b包含m行,结果将有m * n行。

大多数(?)现代数据库都有更清晰的语法,但是:

SELECT     *
FROM       table_a
CROSS JOIN table_b

答案 3 :(得分:1)

交叉连接左连接之间的区别(其中条件被强制始终为真,如使用ON TRUE时)是结果集左连接也会有一些行,其中左表的行显示在右表的列所在的一堆NULL旁边。