このディレクトリの索引

# 出典::SQL質疑応答スレ 13問目 #154 # Oracle10g # # 企業TBL # 1:企業ID # 2:企業名 # 3:電話番号 # 4:最終発送日 # # 上記のようなテーブルがあり、同一企業でも # 複数のレコードに登録されています。 # 電話番号が同一であれば、同一企業とみなし、 # 最終発送日を同一企業内で最新の日付で # 一斉更新したいのですが、プログラムを使わず # SQL文だけで完結することは可能でしょうか? # # 下記のSQLで表示される電話番号のデータを # MAX(最終発送日)で更新するイメージです。 # # SELECT 電話番号,MAX(最終発送日),COUNT(*) # FROM 企業TBL # GROUP BY 電話番号 # HAVING COUNT(*) > 1; # '同一企業でも複数のレコードに登録されています。電話番号が同一であれば、同一企業とみなし、最終発送日を同一企業内で最新の日付で一斉更新したい' :- 電話番号ならびを得る(_電話番号ならび), 電話番号_最終発送日ならび(_電話番号ならび,_電話番号_最終発送日ならび), 最終発送日の更新(_電話番号_最終発送日ならび). 電話番号ならびを得る(_電話番号ならび) :- setof(_電話番号,[_企業ID,_企業名,_電話番号,_最終発送日] ^ ( 企業TBL(_企業ID,_企業名,_電話番号,_最終発送日)),_電話番号ならび). 電話番号_最終発送日ならび(_電話番号ならび,_電話番号_最終発送日ならび) :- findall([_電話番号,_最終発送日],( member(_電話番号,_電話番号ならび), 最終発送日(_電話番号,_最終発送日)),_電話番号_最終発送日ならび). 最終発送日(_電話番号,_最終発送日) :- findmax(_最終発送日,( 企業TBL(_企業ID,_企業名,_電話番号,_最終発送日)),_最終発送日). 最終発送日の更新(_電話番号_最終発送日ならび) :- forall(member([_電話番号,_最終発送日],_電話番号_最終発送日ならび), 最終発送日の更新(_電話番号,_最終発送日)). 最終発送日の更新(_電話番号,_最終発送日) :- 電話番号を鍵に企業データを削除(_電話番号), assertz(企業TBL(_企業ID,_企業名,_電話番号,_最終発送日)). 電話番号を鍵に企業データを削除(_電話番号) :- retract(企業TBL(_企業ID,_企業名,_電話番号,_最終発送日_1)), fail. 電話番号を鍵に企業データを削除(_電話番号). findmax(A,B,C) :- findall(A,B,L), 最大値(L,C). 最大値(L,_最大値) :- select(_最大値,L,R), forall(member(A,R),_最大値 @>= A).