如果我尝试在两个表之间执行LEFT JOIN
而不使用ON
子句,它是否有效。 SQL引擎如何处理这样的连接?它会被视为CROSS JOIN
还是会收到错误。
答案 0 :(得分:3)
如果我猜对了你的意图 -
您似乎正在寻找与CROSS JOIN
类似的内容,但即使右侧为空,您仍然希望返回左侧。
您确实可以使用LEFT JOIN
实现此目的
对于LEFT JOIN
,您必须ON
,但可以使用ON TRUE
。
create table t1 (i int);
insert into t1 (i) values (1),(2),(3);
create table t2 (i int);
select * from t1 cross join t2;
(空结果集)
select * from t1 left join t2 on true;
i i
- ------
1 (null)
2 (null)
3 (null)
答案 1 :(得分:0)
虽然Dudu的代码确实很整洁,但我确实必须运行它来弄清楚它的作用。
在我看来,你有两个场景,即(1)空表和(2)非空表。每个表的表达式可以union
组合在一起。这可能会使事情变得更容易理解。
另外,我建议你避免空值;三值逻辑不值得烦。在这里,我猜测默认值-99
是合适的:
create table t1 (c1 int);
insert into t1 values (1),(2),(3);
create table t2 (c2 int);
select c1, c2
from t1 CROSS JOIN t2
union
select c1, -99 as c2
from t1
where not exists ( select * from t2 );