SQL抽出の書き方について(一部行の削除)
SQLの書き方について質問です。
VIEW(SQL)を作成した時に結果が以下のようになりました。
--------------------------------------
SEIHIN_CD KOJO_CD CAL_DATE KEIKAKU
--------------------------------------
001111 430 20060724 1000
001111 430 20060724 0
001111 430 20060725 0
001111 431 20060724 0
本来なら、SEIHIN_CD,KOJO_CD,CAL_DATEの3つを主キーとしたいので
表の一番上の2行のうちKEIKAKU=1000の方を残しKEIKAKU=0の方を削除したいと思います。
(重複キーの一番上の行のみ残します)
削除したいというよりは本来なら下記のような抽出を行いたいです。
--------------------------------------
SEIHIN_CD KOJO_CD CAL_DATE KEIKAKU
--------------------------------------
001111 430 20060724 1000
001111 430 20060725 0
001111 431 20060724 0
SQL(PL/SQL?)の書き方が解らないのでどなたか教えていただけますと助かります。
文字制限がありますので説明が簡素になりますが、こちらのページを見てSQLを作成しています。
http://oraclesqlpuzzle.hp.infoseek.co.jp/7-64.html
以下が作成したSQLになります。
SELECT distinct a.SEIHIN_CD,a.KOJO_CD,b.CAL_DATE,decode(a.YMD,b.CAL_DATE,a.KEIKAKU,0) as KEIKAKU,b.CAL_WEEK,b.CAL_KBN
from (select SEIHIN_CD,KOJO_CD,KEIKAKU,YMD from T_SEISAN_KEIKAKU)
a,M_00_CALENDER b
order by seihin_cd,kojo_cd,cal_date,keikaku desc
カレンダーのテーブル=M_00_CALENDER
売上テーブル=T_SEISAN_KEIKAKUとなっています。
以上となりますがよろしくお願いいたします。
お礼
アドバイスありがとうございます。 教えていただいた方法ですと、条件に一致した、uid(登録番号)とregdate(登録日)を抽出することができました。 そこで、 delete from totest where a in(select a,b from totest group by a,b having min(d)-b > 10) and b in(select a,b from totest group by a,b having min(d)-b >10); として、希望する行を削除しようとしましたが、以下のようなエラーが出てきました。 ERROR: Subselect has too many fields しかし、教えていただいた方法で、新たにテーブルを作り、それに一致する行を元のテーブルから削除すれば何とかなると思います。 ほんとうにありがとうございます。 SQLて奥が深いですね。