我知道在表格加入中使用了条件。但我遇到了一个特定的情况,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行。所以,它没有必要写“左外连接”,只是一个“连接”会给出相同的输出,对吗?
感谢!!!
答案 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_a
到table_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旁边。