2013-07-27 60 views
3

我有以下非常簡單的左外的MYSQL連接:是左/右外開條款Neccessary加入

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子句,否則左外連接和右外連接不起作用。

順便說一下,2表沒有什麼特別之處,它們之間也沒有外鍵關係。

版:

這是完全連接,在MySQL的工作:

SELECT * FROM員工充分參與部門;

+0

'完全外部'連接*做*需要'ON'子句。沒有交叉連接。 (和自然連接) –

+0

*「如果我做一個」完全加入「,它肯定沒有ON子句」* - 在MySQL中?真?? –

+0

是的,這是一個工作的人:select * from employee full join department; –

回答

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子句。 從不cross join使用on子句。我更喜歡將這些用於natural join(您不會問),因爲我更喜歡在用於連接的列中顯式顯示。

編輯:

SQL Fiddle,5.6版沾到full outer joinleft 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不支持。我不知道爲什麼你的查詢可能有效。

+0

感謝您提供了一個非常明確的解釋。只有一個問題,你提到MySQL不支持完全外連接,但是這種方式正如我上面提到的「select * from employee full join department;」這不是一個完整的外連接嗎?另外,我使用Mysql 5.6.10,我認爲它是最新版本;所以他們可能最近添加了這個。 –

+4

OP的查詢工作原因是因爲他們只是將'employee'表視爲'full' :-) –

+0

@Martin:很好的結果。 –

1

如果你想它沒有ON子句,您需要在2個表中相同的列名: department.departmentId與employee.departmentId

+0

我希望所有這些例外都是不允許的,因爲它們會讓所有的事情變得更加複雜。 –