前提・実現したいこと
重複データを論理削除でUPDATEするSQL文を作成しています。
以下のようなテーブルがあるとします。
order_id | model | color_code | color_name | size_code | size_name | insert_date | del_flg |
---|---|---|---|---|---|---|---|
45 | TD001 | NULL | BL | NULL | L | 2021-08-05 14:22.. | 0 |
54 | TD001 | NULL | BL | NULL | L | 2021-08-05 14:26.. | 0 |
59 | TD001 | NULL | BL | NULL | L | 2021-08-05 14:30.. | 0 |
80 | TD001 | NULL | BL | NULL | L | 2021-08-05 14:40.. | 0 |
46 | TD002 | NULL | GN | NULL | M | 2021-08-06 14:22.. | 0 |
55 | TD002 | NULL | GN | NULL | M | 2021-08-06 14:26.. | 0 |
60 | TD002 | NULL | GN | NULL | M | 2021-08-06 14:30.. | 0 |
81 | TD002 | NULL | GN | NULL | M | 2021-08-06 14:40.. | 0 |
・order_id(PK,bigint,NULL以外) 一意
・model(nvahar(100)、NULL以外)
・color_code(nvahar(100)、NULL)
・color_name(nvahar(100)、NULL)
・size_code(nvahar(100)、NULL)
・size_name(nvahar(100)、NULL)
・insert_date(datetime、NULL)
・del_flg(bit、NULL以外) 0 or 1
該当のソースコード
要件
・重複データの中で、insert_dateで最も新しいデータ以外の古いデータをUPDATEする。
・UPDATEで削除対象のdel_flgを0→1にする。
・各カラムの値を変数に入れて、ループを回したい。。
┗ 上記例だと抽出後2レコードのため、1回ループで2回試行する。
現状、UPDATEはできているのですが主に
・マジックナンバーで指定している
・ループを回す必要がある
ため改修の必要があります。ご教示お願いします。
※追記
現時点でループを使うパターンでしか考えが及びませんでした
本来、ループ使わない方が望ましいので、使わないパターンでご教授いただけると大変助かります。
※追記2
運用上、最も新しいデータのみ残すのが正解でしたので要件を変更しました。
昇順から降順になります。
SQL
1 2-- 重複データの抽出 3SELECT 4 T2.model,T2.color_code,T2.color_name,T2.size_code,T2.size_name ,count(*) 5FROM 6 dbo.order1_trn AS T2 7WHERE 8 T2.del_flg='0' 9GROUP BY 10 T2.model,T2.color_code,T2.color_name,T2.size_code,T2.size_name 11HAVING 12 count(T2.del_flg) > 1 13 14-- UPDATE対象を確認。(insert_dateで最も古いデータ以外がUPDATE対象) 15 16SELECT order_id,insert_date,record_num FROM ( 17 SELECT 18 order_id 19 ,insert_date 20 ,ROW_NUMBER() OVER (ORDER BY insert_date ASC) AS record_num 21 FROM 22 dbo.order1_trn 23 WHERE 24 del_flg='0' 25 AND model='TD001' 26 AND color_code IS NULL 27 AND color_name='BL' 28 AND size_name='L' 29 AND size_code IS NULL 30) AS T2 31WHERE 32 record_num <=(SELECT count(*)-1 FROM dbo.order1_trn WHERE del_flg='0' AND model='TD001' AND color_code IS NULL AND color_name='BL' AND size_name='L' AND size_code IS NULL ) 33 34-- 対象をUPDATEする 35UPDATE dbo.order1_trn SET del_flg='1' WHERE order_id IN( 36SELECT order_id FROM ( 37 SELECT 38 order_id 39 ,insert_date 40 ,ROW_NUMBER() OVER (ORDER BY insert_date ASC) AS record_num 41 FROM 42 dbo.order1_trn 43 WHERE 44 del_flg='0' 45 AND model='TD001' 46 AND color_code IS NULL 47 AND color_name='BL' 48 AND size_name='L' 49 AND size_code IS NULL 50) AS T2 51WHERE 52 record_num <=( 53 SELECT 54 count(*)-1 55 FROM 56 dbo.order1_trn 57 WHERE del_flg='0' AND model='TD001' AND color_code IS NULL AND color_name='BL' AND size_name='L' AND size_code IS NULL ) 58) 59 60-- 結果確認用 61 62SELECT 63 T2.model,T2.color_code,T2.color_name,T2.size_code,T2.size_name ,count(*) 64FROM 65 dbo.order1_trn AS T2 66WHERE 67 T2.del_flg='0' 68GROUP BY 69 T2.model,T2.color_code,T2.color_name,T2.size_code,T2.size_name 70HAVING 71 count(T2.del_flg) > 1 72 73
補足情報(FW/ツールのバージョンなど)
SQL Server Management Studio 15.0.18382.0
回答2件
あなたの回答
tips
プレビュー