SQLの構文として、テーブル結合をするためのJOIN句があるが、これはSELECT文やUPDATE文だけでなく、DELETE文でも利用できる。
今回は、Oracle、MySQL、PostgreSQL、SQL Serverの各DB上で、JOIN句を含むDELETE文を実行してみたので、その結果を共有する。
なお、JOIN句を含むUPDATE文については、以下の記事を参照のこと。
前提条件
下記記事のように、A5M2を利用して各DBに接続できていること。
また、各DB上に、以下のデータが設定されていること。(下図はOracleの例)
1 | SELECT * FROM user_data ORDER BY id ASC |
1 | SELECT * FROM m_sex ORDER BY sex_cd ASC |
やってみたこと
Oracleの場合の実行結果
Oracle上でJOIN句を含むDELETE文の実行結果は、以下の通り。
1) 今回の削除対象となるデータは、user_dataテーブルの性別が「その他」であるデータとする。そのデータを抽出するSELECT文を実行した結果は、以下の通り。
1 2 3 4 | SELECT u.*, s.sex_value FROM user_data u INNER JOIN m_sex s ON u.sex = s.sex_cd WHERE s.sex_value = 'その他' |
2) user_dataテーブルの性別が「その他」であるデータを削除するDELETE文を実行した結果は、以下の通り。
1 2 3 4 5 6 | DELETE ( SELECT u.* FROM user_data u INNER JOIN m_sex s ON u.sex = s.sex_cd WHERE s.sex_value = 'その他' ) |
3) 2)のDELETE文実行後の、 user_dataテーブルの値は以下の通りで、2)で削除したデータが表示されないことが確認できる。
1 | SELECT * FROM user_data ORDER BY id ASC |
MySQLの場合の実行結果
MySQL上でJOIN句を含むDELETE文の実行結果は、以下の通り。
1) 今回の削除対象となるデータは、user_dataテーブルの性別が「その他」であるデータとする。そのデータを抽出するSELECT文を実行した結果は、以下の通り。
1 2 3 4 | SELECT u.*, s.sex_value FROM user_data AS u INNER JOIN m_sex AS s ON u.sex = s.sex_cd WHERE s.sex_value = 'その他' |
2) user_dataテーブルの性別が「その他」であるデータを削除するDELETE文を実行した結果は、以下の通り。
1 2 3 4 5 | DELETE u FROM user_data AS u INNER JOIN m_sex AS s ON u.sex = s.sex_cd WHERE s.sex_value = 'その他' |
3) 2)のDELETE文実行後の、 user_dataテーブルの値は以下の通りで、2)で削除したデータが表示されないことが確認できる。
1 | SELECT * FROM user_data ORDER BY id ASC |
PostgreSQLの場合の実行結果
PostgreSQL上でJOIN句を含むDELETE文の実行結果は、以下の通り。
1) 今回の削除対象となるデータは、user_dataテーブルの性別が「その他」であるデータとする。そのデータを抽出するSELECT文を実行した結果は、以下の通り。
1 2 3 4 | SELECT u.*, s.sex_value FROM user_data AS u INNER JOIN m_sex AS s ON u.sex = s.sex_cd WHERE s.sex_value = 'その他' |
2) user_dataテーブルの性別が「その他」であるデータを削除するDELETE文を実行した結果は、以下の通り。
1 2 3 4 | DELETE FROM user_data AS u USING m_sex AS s WHERE u.sex = s.sex_cd AND s.sex_value = 'その他' |
3) 2)のDELETE文実行後の、 user_dataテーブルの値は以下の通りで、2)で削除したデータが表示されないことが確認できる。
1 | SELECT * FROM user_data ORDER BY id ASC |
SQL Serverの場合の実行結果
SQL Server上でJOIN句を含むDELETE文の実行結果は、以下の通り。
1) 今回の削除対象となるデータは、user_dataテーブルの性別が「その他」であるデータとする。そのデータを抽出するSELECT文を実行した結果は、以下の通り。
1 2 3 4 | SELECT u.*, s.sex_value FROM dbo.user_data AS u INNER JOIN dbo.m_sex AS s ON u.sex = s.sex_cd WHERE s.sex_value = 'その他' |
2) user_dataテーブルの性別が「その他」であるデータを削除するDELETE文を実行した結果は、以下の通り。
1 2 3 4 5 | DELETE u FROM dbo.user_data AS u INNER JOIN dbo.m_sex AS s ON u.sex = s.sex_cd WHERE s.sex_value = 'その他' |
3) 2)のDELETE文実行後の、 user_dataテーブルの値は以下の通りで、2)で削除したデータが表示されないことが確認できる。
1 | SELECT * FROM dbo.user_data ORDER BY id ASC |
要点まとめ
- SQLの構文として、テーブル結合をするためのJOIN句があるが、これは各DB上で、SELECT文やUPDATE文だけでなく、DELETE文でも利用できる。