3

我在 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 中工作的完整连接:

select * from employee full join department;

4

2 回答 2

3

在 ANSI 标准中,oncross join. 这适用于 Oracle 和大多数其他数据库。

MySQL 有点不同。这是 MySQL文档中的语法图:

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对 是可选的join,但不是left outer joinor right outer join。MySQL 不支持full outer join. 并且,为了使它更加混乱cross join,就像join并且可以接受一个on子句。

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

编辑:

根据SQL Fiddlefull outer join ,5.6 版在工作时出现错误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不支持。我不确定为什么您的查询可能有效。

于 2013-07-27T19:33:59.557 回答
1

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

于 2013-07-27T19:33:15.570 回答