SQL実践入門、残り2章になりましたが、いやーむずいっす。
今回は9章を進めていますがSQLはもともと検索を主な用途として発展したため、SELECT文の使用がメインになります。
ですが、UPDATE文などでもSELECTをうまく利用することで効率的なSQLを書くことができます。
例えば下記のようなテーブルがあったとします。
テーブル名 omittbl
keycol | seq | val
———-+—–+—–
A | 1 | 50
A | 2 |
A | 3 |
A | 4 | 70
A | 5 |
A | 6 | 900
B | 1 | 10
B | 2 | 20
B | 3 |
B | 4 | 3
B | 5 |
B | 6 |
紙のデータだと割とよくあるパターンだと思いますが、直前と同じデータがあった場合、省略して書かなかったりします。
例えば A|2 は直前と同じですので値は50 A|5は70になります。
これを埋める場合、サブクエリを使います。
ステップとしては
まずvalがnullののレコードをベースに考え、nullでないseqを求める
これがスタートになります。
こちらを求めたのが下記のSQLです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
SELECT o1.seq AS kara_seq, ( SELECT --例えばA5などはこの条件だと2つ(A1,A4)あるため一番近い値ということで --MAXがいる MAX(o2.seq) FROM omittbl o2 WHERE o1.keycol = o2.keycol and o1.seq > o2.seq and o2.val is not null ) AS not_kara_seq FROM --valがnullのテーブルをベースに考える omittbl o1 WHERE o1.val is null |
出力結果は下記になります。
kara_seq | not_kara_seq
———-+————–
2 | 1
3 | 1
5 | 4
3 | 2
5 | 4
6 | 4