このディレクトリの索引
http://pc11.2ch.net/test/read.cgi/db/1252492296/471
#  【質問テンプレ】 
#  ・DBMS名とバージョン: SQLite 3 
#  ・テーブルデータ:長いため下記に記載 
#  ・欲しい結果:RSSリーダ(brief)のデータ(*.sqlite)から特定の記事データを削除したいです。 
#  ・説明:長いため下記に記載 
#   
#  ●テーブルデータ 
#  ======================================================================================================================= 
#  ■entries 
#   | id | feedID | primaryHash | secondaryHash | providerID | entryURL | date | read | updated | starred | deleted | bookmarkID | 
#  ----------------------------------------------------------------------------------------------------------------------- 
#  ■entries_text 
#   | title | content | authors | tags | 
#  ----------------------------------------------------------------------------------------------------------------------- 
#  ■entries_text_content 
#   | docid | c0title | c1content | c2authors | c3tags | 
#  ----------------------------------------------------------------------------------------------------------------------- 
#  ■sqlite_sequence 
#   | name | seq | 
#  ======================================================================================================================= 
# 
#  1.【entries】テーブルの[deleted]フィールドが「 2 」の場合に、そのレコードを削除。 
#   
#  2.同時に、【entries_text_content】テーブルの[docid]フィールドが、1.で削除した 
#    [id]フィールドと同じ値のレコードも削除。 
#   
#  3.更に同時に、【entries_textテーブル】から、1.で削除した[idフィールド]の値(数字)と 
#    同じレコード番号のレコードを削除。 ※idフィールドがない為 
#   
#  4.その後、下記のフィールドの値を、1・2・3〜とリナンバリングしたい。 
#    【entries】テーブルの[id]フィールド 
#    【entries_text_content】テーブルの[docid]フィールド 
#   
#  5.そして、1.2.3.の三つのテーブルのレコード数がどれも同じ数だけあるか確認。 
#   
#  6.最後に、【sqlite_sequence】テーブルの[seq]フィールドに5.で確認したレコード数を 
#    設定したい。 
#   
#  お手数ですが、以上よろしくお願いします。 
# 
# 

'1.【entries】テーブルの[deleted]フィールドが「 2 」の場合に、そのレコードを削除' :-
        findsetof(_id,(
                    entries(_id,_feedID,_primaryHash,_secondaryHash,_providerID,_entryURL,_date,_read,_updated,_starred,_deleted,_bookmarkID)),
                    _deleted = '2'),
                L1),
        retract_all(entries(_id,_feedID,_primaryHash,_secondaryHash,_providerID,_entryURL,_date,_read,_updated,_starred,'2',_bookmarkID)),
        findsetof(_docid,(
                    member(_id,L1),
                    entries_text_contents(_docid,_c0title,_c1content,_c2authors,_c3tags)),
                    _docid = _id),
                L2),
        '2.同時に、【entries_text_content】テーブルの[docid]フィールドが、1.で削除した[id]フィールドと同じ値のレコードも削除。'(L2),
        '3.更に同時に、【entries_textテーブル】から、1.で削除した[idフィールド]の値(数字)と同じレコード番号のレコードを削除。'(L1),!.

'2.同時に、【entries_text_content】テーブルの[docid]フィールドが、1.で削除した[id]フィールドと同じ値のレコードも削除。'(L2) :-
        member(_docid,L2),
        retract_all(entries_text_contents(_docid,_c0title,_c1content,_c2authors,_c3tags)),!.

'3.更に同時に、【entries_textテーブル】から、1.で削除した[idフィールド]の値(数字)と同じレコード番号のレコードを削除。'(L1) :-
        append(_,[Nth|R],L1),
        節の定義位置指定による節の削除(L2,Nth),
        R = [],!.
'3.更に同時に、【entries_textテーブル】から、1.で削除した[idフィールド]の値(数字)と同じレコード番号のレコードを削除。'(_).

節の定義位置指定による節の削除(L2,Nth) :-
        findall((Head :- Body),(
                        clause(entries_text(_title,_content,_authors,_tags),Head,Body)),
                L2),
        list_nth(Nth,L2,P),
        retract(P),!.

'4.その後、下記のフィールドの値を、1・2・3〜とリナンバリングしたい。 【entries】テーブルの[id]フィールド 【entries_text_content】テーブルの[docid]フィールド' :-
        findall(entries(_id,_feedID,_primaryHash,_secondaryHash,_providerID,_entryURL,_date,_read,_updated,_starred,_deleted,_bookmarkID),(
                    retract(entries(_id,_feedID,_primaryHash,_secondaryHash,_providerID,_entryURL,_date,_read,_updated,_starred,_deleted,_bookmarkID))),
                L1),
        append(L01,[entries(_,_feedID,_primaryHash,_secondaryHash,_providerID,_entryURL,_date,_read,_updated,_starred,_deleted,_bookmarkID)|R1],L1),
        length([_|L0],Nth1),
        assertz(entries(Nth1,_feedID,_primaryHash,_secondaryHash,_providerID,_entryURL,_date,_read,_updated,_starred,_deleted,_bookmarkID)),
        R1 = [],
        findall(entries_text_contents(_,_c0title,_c1content,_c2authors,_c3tags),(
                    retract(entries_text_contents(_docid,_c0title,_c1content,_c2authors,_c3tags))),
                L2),
        append(L02,[entries_text_contents(_,_c0title,_c1content,_c2authors,_c3tags)|R2],L2),
        length([_|L02],Nth2),
        assertz(entries_text_contents(Nth2,_c0title,_c1content,_c2authors,_c3tags)),
        R2 = [],!.

'5.そして、1.2.3.の三つのテーブルのレコード数がどれも同じ数だけあるか確認。'(Count) :-
        count(entries(_id,_feedID,_primaryHash,_secondaryHash,_providerID,_entryURL,_date,_read,_updated,_starred,_deleted,_bookmarkID),Count),
        count(entries_text_contents(_docid,_c0title,_c1content,_c2authors,_c3tags),Count),
        count(entries_text(_title,_content,_authors,_tags),Count).

'6.最後に、【sqlite_sequence】テーブルの[seq]フィールドに5.で確認したレコード数を設定したい。'(Count) :-
        retract(sqlite_sequence(_name,_seq)),
        assertz(sqlite_sequence(_name,Count),!.