我可以在不使用ON子句的情况下连接两个表吗?

时间:2016-11-02 06:12:52

标签: mysql sql postgresql

如果我尝试在两个表之间执行LEFT JOIN而不使用ON子句,它是否有效。 SQL引擎如何处理这样的连接?它会被视为CROSS JOIN还是会收到错误。

2 个答案:

答案 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 );