【问题标题】:Can I left join two tables without using ON clause?我可以在不使用 ON 子句的情况下加入两个表吗?
【发布时间】:2017-03-15 09:15:29
【问题描述】:

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

【问题讨论】:

  • “或者我会得到一个错误” --- 如果你你问之前就努力解决你的问题怎么办?
  • 我没有可以工作的笔记本电脑,我从手机上发布了问题.. 对此感到抱歉...
  • SQLfiddle 在智能手机上工作
  • 与其直接跳到您将随机附加在一起的关键字以希望获得您想要的结果 - 也许向我们解释您正在做什么以及您希望获得什么结果。希望有样本数据和预期结果表。

标签: mysql sql postgresql


【解决方案1】:

如果我猜对了你的意图 -
您似乎正在寻找类似于 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) 

【讨论】:

  • 这会导致连接等同于交叉连接......如果没有对某些行匹配而某些行可能不匹配的连接的限定,则使用左连接根本没有意义被匹配。 ON TRUE 不允许某些行不匹配。
  • 有一个“边缘情况”,left join on true 允许返回行,但cross join 不允许。在我之前的回复中,我没有考虑过这种极端情况。对于我的疏忽,我深表歉意。但是,如果您重新阅读该回复,它会声明 there simply is no point 并且没有实际理由将没有行的表“左连接为真”到有行的表。而且,在没有 ON 的情况下仍然不可能进行左连接(这是问题所在)
  • @Used_By_Already - 你可能想看看下面的帖子 :-) stackoverflow.com/questions/41010016/…
【解决方案2】:

虽然 Dudu 的代码确实很简洁,但我确实必须实际运行它才能弄清楚它的作用。

在我看来,您有两种情况,即 (1) 空表和 (2) 非空表。每个表表达式可以unioned 在一起。这可能会使事情更容易理解。

另外,我建议您避免使用空值;三值逻辑不值得费心。这里我猜-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 --> t1 cross join t2(不是必须的,但澄清这不是一个带有意外省略连接条件的旧式连接)
  • union --> union all(union 会消除 t1 或 t2 中可能存在的重复)
  • @DuduMarkovitz:已将CROSS JOIN 版本恢复为我的答案。 union 的使用是设计使然,即不希望重复!
猜你喜欢
  • 1970-01-01
  • 2021-03-05
  • 2019-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多