MySQLは複数テーブル同時削除の構文がある
PostgreSQLは他テーブルを参照する拡張構文がある
SQL Serverはサブクエリでの挙動が微妙のため、拡張構文を使用したほうがよい。
(8.0.22)
https://qiita.com/toshiro3/items/b2e57a9867139bbdd439
drop table tab1;
drop table tab2;
create table tab1(col1 int,col2 int);
create table tab2(col1 int,col2 int);
insert into tab1 values(1,10);
insert into tab1 values(2,20);
insert into tab1 values(3,20);
insert into tab2 values(1,10);
insert into tab2 values(2,20);
insert into tab2 values(3,31);
select * from tab1;
select * from tab2;
-- FROM句なし
delete tab1;
→ ERROR 1064 (42000): You have an error in your SQL syntax;
-- サブクエリ
delete from tab1 A
where A.col2 in ( select B.col2 from tab2 B where A.col1 = B.col1)
;
→ OK
-- 複数テーブル同時削除
delete A,B
from tab1 A inner join tab2 B
on A.col1 = B.col1
where A.col2 = 10
;
→ OK
-- 拡張構文
delete from tab1 A
using tab2 B
where A.col1 = B.col1
and A.col2 = B.col2
;
→ ERROR 1064 (42000): You have an error in your SQL syntax;
(19c)
drop table tab1 purge;
drop table tab2 purge;
create table tab1(col1 int,col2 int);
create table tab2(col1 int,col2 int);
insert into tab1 values(1,10);
insert into tab1 values(2,20);
insert into tab1 values(3,20);
insert into tab2 values(1,10);
insert into tab2 values(2,20);
insert into tab2 values(3,31);
select * from tab1;
select * from tab2;
-- FROM句なし
delete tab1;
→ OK
-- サブクエリ
delete from tab1 A
where A.col2 in ( select B.col2 from tab2 B where A.col1 = B.col1)
;
→ OK
-- 複数テーブル同時削除
delete A,B
from tab1 A inner join tab2 B
on A.col1 = B.col1
where A.col2 = 10
;
→ ORA-00933: SQLコマンドが正しく終了されていません。
-- 拡張構文
delete from tab1 A
using tab2 B
where A.col1 = B.col1
and A.col2 = B.col2
;
→ ORA-00933: SQLコマンドが正しく終了されていません。
(13)
drop table tab1;
drop table tab2;
create table tab1(col1 int,col2 int);
create table tab2(col1 int,col2 int);
insert into tab1 values(1,10);
insert into tab1 values(2,20);
insert into tab1 values(3,20);
insert into tab2 values(1,10);
insert into tab2 values(2,20);
insert into tab2 values(3,31);
select * from tab1;
select * from tab2;
-- FROM句なし
delete tab1;
→ ERROR: syntax error at or near "tab1"
-- サブクエリ
delete from tab1 A
where A.col2 in ( select B.col2 from tab2 B where A.col1 = B.col1)
;
→ OK
-- 複数テーブル同時削除
delete A,B
from tab1 A inner join tab2 B
on A.col1 = B.col1
where A.col2 = 10
;
→ ERROR: syntax error at or near "A"
-- PostgreSQL 拡張構文
delete from tab1 A
using tab2 B
where A.col1 = B.col1
and A.col2 = B.col2
;
→ OK
(2019)
drop table tab1;
drop table tab2;
create table tab1(col1 int,col2 int);
create table tab2(col1 int,col2 int);
insert into tab1 values(1,10);
insert into tab1 values(2,20);
insert into tab1 values(3,20);
insert into tab2 values(1,10);
insert into tab2 values(2,20);
insert into tab2 values(3,31);
select * from tab1;
select * from tab2;
-- FROM句なし
delete tab1;
→ OK
-- サブクエリ
delete from tab1
where col2 in ( select B.col2 from tab2 B where col1 = B.col1)
;
→ ★他DBと結果が異なる。エイリアスが使用できず、相関サブクエリになっていない模様。
-- 複数テーブル同時削除
delete A,B
from tab1 A inner join tab2 B
on A.col1 = B.col1
where A.col2 = 10
;
→ ',' 付近に不適切な構文があります。
-- Transact-SQL 拡張構文
delete from A
from tab1 A,tab2 B
where A.col1 = B.col1
and A.col2 = B.col2
;
→ OK