数据库
首页 > 数据库> > mysql-左/右外部联接是否需要On子句

mysql-左/右外部联接是否需要On子句

作者:互联网

我在MYSQL中有以下非常简单的左外部联接:

select * from employee left  join department

但是,这给了我毫无意义的错误信息

Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ” at line 1

但是,如果我仅添加如下所示的ON子句,则查询有效:

select * from employee left  join department on employee.departmentId = department.id;

那么,ON子句是强制性的吗?如果我执行“完全连接”,则肯定没有ON子句就可以使用,但是除非我向它们添加ON子句,否则左右外部连接不起作用.

顺便说一下,这两个表没有什么特别的,它们之间也没有外键关系.

版:

这是在MySql中有效的完全连接:

从员工正式加入部门中选择*;

解决方法:

在ANSI标准中,除交叉联接外,所有联接类型都需要打开.这适用于Oracle和大多数其他数据库.

MySQL有点不同.这是MySQL documentation中的语法图:

join_table:
    table_reference [INNER | CROSS] JOIN table_factor [join_condition]
  | table_reference STRAIGHT_JOIN table_factor
  | table_reference STRAIGHT_JOIN table_factor ON conditional_expr
  | table_reference {LEFT|RIGHT} [OUTER] JOIN table_reference join_condition
  | table_reference NATURAL [{LEFT|RIGHT} [OUTER]] JOIN table_factor

也就是说,MySQL允许on对于联接是可选的,但不允许左外部联接或右外部联接. MySQL不支持完全外部联接.而且,使它变得更加令人困惑的交叉联接就像联接并且可以接受on子句.

并且,您应该忽略MySQL扩展.始终对左,右和内部联接使用on子句.切勿使用on子句进行交叉连接.我更喜欢将它们用于自然联接(您不需要询问),因为我希望在用于联接的列中明确说明.

编辑:

根据SQL Fiddle,当左外部联接起作用时,版本5.6在完全外部联接上出错.所以这会产生一个错误:

select *
from (select 1 as a) t1 full outer join
     (select 2 as b) t2
     on t1.a = t2.b;

这也会产生一个错误:

select *
from (select 1 as a) t1 full join
     (select 2 as b) t2;

MySQL文档(通过5.7)非常清楚,不支持完全连接.我不确定为什么您的查询可能有效.

标签:outer-join,oracle,sql,mysql
来源: https://codeday.me/bug/20191030/1969196.html