- PR -

SQL DELETE文

1
投稿者投稿内容
まー
会議室デビュー日: 2005/12/18
投稿数: 10
投稿日時: 2007-06-27 13:49
DB2を使用しています。
どうしても自分では解決できないSQLがあり詳しい方がいらっしゃいましたら教えていただけないでしょうか。

以下の表のように削除フラグがすべて立っているレコードのみをすべて削除したい。
table1とtable2はKey1でLeftJoinされ、table2とtable3はKey1,Key2でLeftJoinされる。

コード:
+-----------+----------------+----------------+
|table1     |table2          |table3          |
+----+------+----+----+------+----+----+------+
|Key1|DelFlg|Key1|Key2|DelFlg|Key1|Key2|DelFlg|
+----+------+----+----+------+----+----+------+
|AAA |空白  |-   |-   |-     |-   |-   |-     |←削除対象外
|BBB |1     |-   |-   |-     |-   |-   |-     |←削除
|CCC |1     |CCC |1   |1     |-   |-   |-     |←削除
|DDD |1     |DDD |1   |1     |DDD |1   |空白  |←削除対象外
|EEE |1     |EEE |1   |1     |EEE |1   |1     |←削除
|EEE |1     |EEE |2   |1     |EEE |2   |1     |←削除
+----+------+----+----+------+----------------+


よっしー
大ベテラン
会議室デビュー日: 2007/05/17
投稿数: 143
投稿日時: 2007-06-28 00:26
table1のDelFlgが0でtable2のDelFlgが1というデータはないのですよね?
次のSQLでどうでしょうか?申し訳ございませんが全く検証していません。

DELETE table3 WHERE DelFlg = 1

DELETE table2 WHERE DelFlg = 1
AND NOT EXISTS (SELECT * FROM table3 WHERE key1 = table2.key1
AND key2 = table2.key2 AND DelFlg = 0)

DELETE table1 WHERE DelFlg = 1
AND NOT EXISTS (SELECT * FROM table2 WHERE key1 = table1.key1 AND DelFlg = 0)
片桐 継
会議室デビュー日: 2007/05/16
投稿数: 14
お住まい・勤務地: 東京
投稿日時: 2007-06-28 00:44
よっしーさんのSQLですと、DELFLG = 0 ではなく、DELFLG is null でしょうね。

ただし、DELFLGの付与条件といいますか要件において

T1|T2|T3|
●|●|●|
●|●|□|
●|□|□| ●:DELFLGあり □:DELFLGなし

という関係だけが存在する、ということが前提です。


_________________
片桐 継(Tugu Katagiri)@わんくま同盟
http://blogs.wankuma.com/esten
よっしー
大ベテラン
会議室デビュー日: 2007/05/17
投稿数: 143
投稿日時: 2007-06-28 01:06
引用:

片桐 継さんの書き込み (2007-06-28 00:44) より:
よっしーさんのSQLですと、DELFLG = 0 ではなく、DELFLG is null でしょうね。



0なんてどこにもないですね。null(空白?)の誤りでした。

引用:

ただし、DELFLGの付与条件といいますか要件において

T1|T2|T3|
●|●|●|
●|●|□|
●|□|□| ●:DELFLGあり □:DELFLGなし

という関係だけが存在する、ということが前提です。


手抜きです。
でも、table1から消した方が簡単なのかも。
とんくま
ベテラン
会議室デビュー日: 2005/08/02
投稿数: 56
お住まい・勤務地: 東京
投稿日時: 2007-06-28 01:29
コード:
------------------------------ Commands Entered ------------------------------
SELECT t1.*, t2.*, t3.*
  FROM table1 t1
       LEFT OUTER JOIN
       table2 t2
         ON  t2."Key1" = t1."Key1"
       LEFT OUTER JOIN
       table3 t3
         ON  t3."Key1" = t2."Key1"
         AND t3."Key2" = t2."Key2"
 ORDER BY t1."Key1", t2."Key2";
------------------------------------------------------------------------------

Key1 DelFlg Key1 Key2 DelFlg Key1 Key2 DelFlg
---- ------ ---- ---- ------ ---- ---- ------
AAA         -    -    -      -    -    -     
BBB  1      -    -    -      -    -    -     
CCC  1      CCC  1    1      -    -    -     
DDD  1      DDD  1    1      DDD  1          
DDD  1      DDD  2           DDD  2    1     
EEE  1      EEE  1    1      EEE  1    1     
EEE  1      EEE  2    1      EEE  2    1     

  7 record(s) selected.


Key1 = 'DDD', Key2 = '2' の行を追加しました。
また、列名などのオブジェクトをダブル・クォーテーション(")で囲って大文字・小文字を区別するのは、私の趣味では有りません(ケアレス・ミスを起こしやすいし、面倒だから)が、今回は「まー」さんの例に出来るだけ合わせるためにあえて使用しました。

コード:
------------------------------ Commands Entered ------------------------------
WITH DeleteKey ("Key1", "Key2") AS (
SELECT t1."Key1"
     , t2."Key2"
  FROM table1 t1
       LEFT OUTER JOIN
       table2 t2
         ON  t2."Key1" = t1."Key1"
       LEFT OUTER JOIN
       table3 t3
         ON  t3."Key1" = t2."Key1"
         AND t3."Key2" = t2."Key2"
 WHERE t1."DelFlg"
       ||COALESCE(t2."DelFlg", '1')
       ||COALESCE(t3."DelFlg", '1')
       = '111'
)
,Delete1 (count1) AS (
SELECT COUNT(*)
  FROM OLD TABLE
       (
        DELETE FROM table1 t1
         WHERE EXISTS
               (SELECT *
                  FROM DeleteKey dk
                 WHERE dk."Key1" = t1."Key1"
               )
       ) S
)
,Delete2 (count2) AS (
SELECT COUNT(*)
  FROM OLD TABLE
       (
        DELETE FROM table2 t2
         WHERE EXISTS
               (SELECT *
                  FROM DeleteKey dk
                 WHERE dk."Key1" = t2."Key1"
                   AND dk."Key2" = t2."Key2"
               )
       ) S
)
,Delete3 (count3) AS (
SELECT COUNT(*)
  FROM OLD TABLE
       (
        DELETE FROM table3 t3
         WHERE EXISTS
               (SELECT *
                  FROM DeleteKey dk
                 WHERE dk."Key1" = t3."Key1"
                   AND dk."Key2" = t3."Key2"
               )
       ) S
)
SELECT count1, count2, count3
  FROM Delete1
     , Delete2
     , Delete3;
------------------------------------------------------------------------------

COUNT1      COUNT2      COUNT3     
----------- ----------- -----------
          3           3           2

  1 record(s) selected.



コード:
------------------------------ Commands Entered ------------------------------
SELECT t1.*, t2.*, t3.*
  FROM table1 t1
       LEFT OUTER JOIN
       table2 t2
         ON  t2."Key1" = t1."Key1"
       LEFT OUTER JOIN
       table3 t3
         ON  t3."Key1" = t2."Key1"
         AND t3."Key2" = t2."Key2"
 ORDER BY t1."Key1", t2."Key2";
------------------------------------------------------------------------------

Key1 DelFlg Key1 Key2 DelFlg Key1 Key2 DelFlg
---- ------ ---- ---- ------ ---- ---- ------
AAA         -    -    -      -    -    -     
DDD  1      DDD  1    1      DDD  1          
DDD  1      DDD  2           DDD  2    1     

  3 record(s) selected.


1

スキルアップ/キャリアアップ(JOB@IT)