左/右外连接是否需要On子句

时间:2013-07-27 19:28:43

标签: mysql sql oracle outer-join

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

select * from employee left  join department

然而,这给了我无意义的错误信息

  

错误代码:1064。您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以便在第1行的''附近使用正确的语法

但是,如果我只是添加一个ON子句,如下所示,查询工作:

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

那么,ON条款是强制性的吗?如果我执行“完全加入”,它肯定在没有ON子句的情况下工作,但是除非我向它们添加ON子句,否则左外连接和右外连接都不起作用。

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

版:

这是在MySql中运行的完整联接:

从员工完全加入部门中选择*;

2 个答案:

答案 0 :(得分:3)

在ANSI标准中,除on之外的所有联接类型都需要cross join。这适用于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允许onjoin的可选项,而不是left outer joinright outer join。 MySQL不支持full outer join。而且,为了让它更加混乱cross join就像join可以接受on条款。

而且,你应该忽略MySQL扩展。 始终对左,右和内连接使用on子句。 从不on使用cross join子句。我更喜欢将这些用于natural join(你没有问过),因为我更喜欢在用于连接的列中明确。

编辑:

根据SQL Fiddle,版本5.6在full outer join工作时left outer join出错。所以这会产生错误:

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)非常明确,full join不受支持。我不确定为什么你的查询可能有效。

答案 1 :(得分:1)

如果您希望它在没有ON子句的情况下工作,则需要在2个表中使用相同的列名: department.departmentId with employee.departmentId