我可以在不使用ON子句的情况下进行左连接两个表吗?
可以不使用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操作是为了避免重复数据的出现。
希望以上内容对你有所帮助。
可以在不使用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/…