delete文各種

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