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

9 浏览
0 Comments

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

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

0
0 Comments

可以不使用ON子句来进行左连接吗?

这个问题的出现是因为需要进行左连接操作,但是在实际的代码中没有找到使用ON子句的地方,因此需要找到一种解决方法来实现左连接的功能。

解决方法如下:

首先,可以将表达式中的两个场景即(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 );

以上代码中,t1和t2表示需要进行左连接的两个表,通过CROSS JOIN操作实现左连接的功能。使用UNION操作是为了避免重复数据的出现。

希望以上内容对你有所帮助。

0
0 Comments

可以在不使用ON子句的情况下进行左连接吗?

如果我猜测你的意图正确的话 -

看起来你想要类似于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)

这将导致连接等同于交叉连接......没有使用left join的合理性,除非对连接进行限定,其中一些行是匹配的,一些行可能不匹配。ON TRUE不允许某些行不匹配。

只有一个"边缘情况",left join on true可以返回行,而cross join则不会。我之前的回答中没有考虑到这种情况。对于我的疏忽,我向你道歉。然而,如果你重新阅读那个回答,它说到there simply is no point,没有实际理由让一个没有行的表"left joined on true"到一个有行的表。而且,没有办法在没有ON的情况下进行左连接(这是问题所在)。

_By_Already - 你可能想看看以下的帖子:)stackoverflow.com/questions/41010016/…

0