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