ORACLE機能 SQL

[SQL] JOIN句があるSQLで条件をON句に書く場合とWHERE句に書く場合の違い

投稿日:

JOIN句があるSQLで、WHERE条件はON句にもWHERE句にも書けますが、条件によって結果が違ってきますので注意が必要です。

条件をON句に書く場合とWHERE句に書く場合の違い

結論から書くと、以下のような違いがあります。

  • 内部結合(INNER JOIN)の場合は、ON句に書いてもWHERE句に書いても結果は同じ。
  • 外部結合(OUTER JOIN)の場合は、ON句とWHERE句に書く場合で結果が異なる。

なので、内部結合の場合はONに書くかWHEREに書くかは好みで良いですが、
外部結合の場合は注意が必要です。

違いの例

以下2つのテーブルをbusyo_cdで外部結合し、条件にbusyo_cd = 104を指定してみます。

【m_user】
nonamebusyo_cd
1A101
2B102
3C103
4D104
5E104
【m_busyo】
busyo_cdbusyo_name
101総務部
102経理部
103営業部
104開発部

例)条件をON句に書く場合

SQL*Plus
SQL>SELECT u.no, u.name, u.busyo_cd, b.busyo_name FROM m_user u LEFT OUTER JOIN m_busyo b ON u.busyo_cd = b.busyo_cd AND u.busyo_cd = 104 NO NAME BUSYO_CD BUSYO_NAME --- ----- --------- ----------- 1 A 101 NULL 2 B 102 NULL 3 C 103 NULL 4 D 104 開発部 5 E 104 開発部 SQL>

条件をON句に書いた場合は、 外部結合では結合しなかった場合でも値を取得するので 条件に合致しないデータも引っ張ってきます。

例)条件をWHERE句に書く場合

SQL*Plus
SQL>SELECT u.no, u.name, u.busyo_cd, b.busyo_name FROM m_user u LEFT OUTER JOIN m_busyo b ON u.busyo_cd = b.busyo_cd WHERE u.busyo_cd = 104 NO NAME BUSYO_CD BUSYO_NAME --- ----- --------- ----------- 4 D 104 開発部 5 E 104 開発部 SQL>

条件をWHERE句に書いた場合は、 外部結合した結果に対して条件を指定することになるので、 条件に合致しないデータは除外されます。

まとめ

  • 内部結合の場合は、ON句とWHERE句のどちらに書いても結果は同じ。
  • 外部結合の場合は、条件に合致しないデータも引っ張ってきたい場合はON句に、そうでない場合はWHERE句に書く。

スポンサーリンク

スポンサーリンク

-ORACLE機能, SQL

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

ORACLE

[ORACLE] テンポラリーテーブルの一覧を取得する

テンポラリーテーブルの一覧を取得するSQLです。 サンプル 例)テンポラリーテーブルの一覧を取得する [crayon-5 ...
ORACLE

[ORACLE] 表領域の自動拡張をオフに変更する

表領域の自動拡張をオフに変更するサンプルです。 自動拡張の設定はデータファイル単位に行うため、データファイルの設定を変更 ...
ORACLE

[データディクショナリ] 列の情報を取得する

テーブルの列(COLUMN)の情報を参照するには、 TAB_COLUMNSデータディクショナリビューを参照します。 TA ...
ORACLE

[ORAエラー] ORA-30006: リソース・ビジー; WAITタイムアウトの期限に達しました。

以下のように表示されます。 (日本語) ORA-30006: リソース・ビジー; WAITタイムアウトの期限に達しました ...
ORACLE

[ORACLE関数] 指定した単位でMIN値を取得する(MIN~OVER)

指定した単位でMIN値を取得するには、MIN~OVER句を使用します。 サンプル 以下のテーブルを使用します。 【T_S ...

スポンサーリンク