トップページに戻る    次のSQLパズルへ    前のSQLパズルへ

9-50 ベクトルで考える

SQLパズル

WillDeleteTable
PKey1  PKey2  PKey3  Col1  Col2
-----  -----  -----  ----  ----
 1000   2000      1  AAAA  BBBB
 1000   3000      2  AAAA  BBBB  ←削除対象
 1000   4000      3  AAAA  BBBB
 2000   1000      1  AAAA  CCCC  ←削除対象
 3000   2000      2  AAAA  CCCC  ←削除対象
 3000   2000      3  AAAA  CCCC

WillDeleteTableの削除対象の行を削除する。

WillDeleteTableのプライマリキーは、
PKey1,PKey2,PKey3
とする

削除結果
PKey1  PKey2  PKey3  Col1  Col2
-----  -----  -----  ----  ----
 1000   2000      1  AAAA  BBBB
 1000   4000      3  AAAA  BBBB
 3000   2000      3  AAAA  CCCC
9-29 ソートした数列で考えるのアレンジ問題です


データ作成スクリプト

create table WillDeleteTable(
PKey1 number(4),
PKey2 number(4),
PKey3 number(4),
Col1  char(4),
Col2  char(4),
primary key(PKey1,PKey2,PKey3));

insert into WillDeleteTable values(1000,2000,1,'AAAA','BBBB');
insert into WillDeleteTable values(1000,3000,2,'AAAA','BBBB');
insert into WillDeleteTable values(1000,4000,3,'AAAA','BBBB');
insert into WillDeleteTable values(2000,1000,1,'AAAA','CCCC');
insert into WillDeleteTable values(3000,2000,2,'AAAA','CCCC');
insert into WillDeleteTable values(3000,2000,3,'AAAA','CCCC');
commit;


SQL

--■■■andとorを使う方法■■■
delete from WillDeleteTable
where (PKey1 = 1000 and PKey2 = 3000 and PKey3 = 2)
   or (PKey1 = 2000 and PKey2 = 1000 and PKey3 = 1)
   or (PKey1 = 3000 and PKey2 = 2000 and PKey3 = 2);

--■■■ベクトルで考える方法■■■
delete from WillDeleteTable
where (PKey1,PKey2,PKey3) in((1000,3000,2),(2000,1000,1),(3000,2000,2));


解説

データ整備で、複数行をdeleteするというのは、よくありますが
ベクトルの考え方に似た条件指定を使うと、
SQLを短くできます

SQL For Practitioners 2-3. リスト比較

2-1-16 式のリストの比較その1
2-1-17 式のリストの比較その2