このディレクトリの索引
http://toro.2ch.net/test/read.cgi/db/1316769778/787
#  id5とid10という2つの情報しかないのですが 
#  id5がもつc1とid10がもつc1を交換するとき 
#  どういうクエリーをかけばよいでしょうか? 
#   
#  1.select c1 from t where id=5 or id=10 order by id 
#  2.begin transaction 
#  3.update t set c1=? where id=5 (?は1でとったid10のc1値) 
#  4.update t set c1=? where id=10 (?は1でとったid5のc1値) 
#  5.commit 
#   
#  自分の能力ではこんな手順が限界ですが 
#  サブクエリーを駆使したらupdate1文でいけたりするのでしょうか? 
#  もしできたらどんな感じの文になるか教えていただきたいです 
# 

'id5とid10という2つの情報しかないのですがid5がもつc1とid10がもつc1を交換する' :-
        '引数の数,c1の位置,idの位置'(_引数の数,_c1の位置,_idの位置),
        idが5の処理(_引数の数,_c1の位置,_idの位置),
        idが10の処理(_引数の数,_c1の位置,_idの位置),
        交換する(L0_1,L0_2,R1,R2).

'引数の数,c1の位置,idの位置'(_引数の数,_c1の位置,_idの位置) :-
        findmax(_位置,(
                    テーブル定義(t,_位置,_),
                _引数の数),
        テーブル定義(t,_c1の位置,c1),
        テーブル定義(t,_idの位置,id).

idが5の処理(_引数の数,_c1の位置,_idの位置,L0_1,R1) :-
        'idが5のデータを一旦削除する'(_引数の数,_c1の位置,_idの位置,L1),
        'L1をc1の前と後に分解'(L1,L0_1,R1).

idが5のデータを一旦削除する(_引数の数,_c1の位置,_idの位置,L1) :-
        length(L1,_引数の数),
        P =.. [t|L1],
        nth1(_c1の位置,L1,_c1_1),
        nth1(_idの位置,L1,5),
        retract(P).

idが10の処理(_引数の数,_c1の位置,_idの位置,L0_2,R2) :-
        idが10のデータを一旦削除する(_引数の数,_c1の位置,_idの位置,L2),
        'L1をc1の前と後に分解'(L2,L0_2,R2).

idが10のデータを一旦削除する(_引数の数,_c1の位置,_idの位置,L2) :-
        length(L2,_引数の数),
        P =.. [t|L2],
        nth1(_c1の位置,L2,_c1_2),
        nth1(_idの位置,L2,10),
        retract(P).

'L1をc1の前と後に分解'(L1,L0_1,R1) :-
        length([_|L0_1],_c1の位置),
        append(L0_1,[A|R1],L1).

交換して定義する(L0_1,L0_2,R1,R2) :-
        append(L0_1,[B|R1],L1),
        append(L0_2,[A|R2],L2),
        P_1 =.. [t|L1],
        P_2 =.. [t|L2],
        asserta(P_1),
        asserta(P_2).