我在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中运行的完整联接:
从员工完全加入部门中选择*;
答案 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允许on
是join
的可选项,而不是left outer join
或right 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