3

MYSQL に次の非常に単純な左外部結合があります。

select * from employee left  join department

ただし、これにより意味のないエラーメッセージが表示されます

エラー コード: 1064。SQL 構文にエラーがあります。1 行目の near '' を使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。

しかし、以下に示すように ON 句を追加するだけで、クエリは機能します。

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

では、ON 句は必須ですか? 「完全結合」を実行すると、ON 句がなくても確実に機能しますが、ON 句を追加しない限り、左右の外部結合は機能しません。

ちなみに、2 つのテーブルには特別なことは何もありませんし、それらの間に外部キーの関係もありません。

版:

これは、MySql で機能する完全結合です。

select * from employee full join department;

4

2 に答える 2

3

ANSI 標準でonは、 を除くすべての結合タイプに必須ですcross 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ません。MySQL はサポートしていません。そして、それをより混乱させるのは、句を受け入れるようなものです。left outer joinright outer joinfull outer joincross joinjoinon

また、MySQL 拡張機能は無視してください。 左結合、右結合、および内部結合には 必ず節を使用してください。for 句は使用しないでください。結合に使用されている列で明示的にすることを好むため、これらを使用することを好みます (これについては質問しません)。ononcross joinnatural 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サポートされていないことを非常に明確に示しています。クエリが機能した理由がわかりません。

于 2013-07-27T19:33:59.557 に答える
1

ON句なしで機能させたい場合は、2つのテーブルに同じ列名が必要です: department.departmentId と employee.departmentId

于 2013-07-27T19:33:15.570 に答える