はじめに
SQLの
反面、
というわけで、
稼働環境は次のとおりで、
- Oracle9i以降(Oracle10. 2.0. 1) 
- SQL Server 2005以降(SQLServer 2005) 
- DB2(DB2 9. 5) 
- PostgreSQL(PostgreSQL 8. 3) 
- MySQL 5.0以降 (MySQL 5. 0) 
NULLが存在するテーブル
NULLの埋め立て
さて、
| 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 | 
人間ならそういうルールと知っていればすぐわかりますが、
そこで、
- 同じkeycolを持つ
- 自分より小さいseqを持つ
- valがNULLではない
という3つの条件を満たす集合に絞り、
| keycol | seq | Val | 
|---|---|---|
| A | 1 | 50 | 
| A | 2 | 50 ← 埋めた | 
| A | 3 | 50 ← 埋めた | 
| A | 4 | 70 | 
| A | 5 | 70 ← 埋めた | 
| A | 6 | 900 | 
| B | 1 | 10 | 
| B | 2 | 20 | 
| B | 3 | 20 ← 埋めた | 
| B | 4 | 3 | 
| B | 5 | 3 ← 埋めた | 
| B | 6 | 3 ← 埋めた | 
UPDATE OmitTbl
   SET val = (SELECT val
                FROM OmitTbl O1
              WHERE O1.keycol = OmitTbl.keycol ―①同じkeycolを持つ
                AND O1.seq = (SELECT MAX(seq)
                               FROM OmitTbl O2
                             WHERE O2.keycol = OmitTbl.keycol
                                AND O2.seq  ―②自分より小さいseqを持つ
                                AND O2.val IS NOT NULL)) ―③valがNULLではない
WHERE val IS NULL;逆にNULLを作成する
ちなみに、
UPDATE OmitTbl
   SET val = CASE WHEN val
                 = (SELECT val                                  
                      FROM OmitTbl O1                           
                    WHERE O1.keycol = OmitTbl.keycol            
                      AND O1.seq                                
                           = (SELECT MAX(seq)                   
                                FROM OmitTbl O2                 
                               WHERE O2.keycol = OmitTbl.keycol 
                                 AND O2.seq ←スカラ・サブクエリ全体をCASE 式の引数としている
            THEN NULL
            ELSE val END;先ほどの1~3の条件に合致する行に関してはNULLを、
ちなみに、
