objects
(primary key object_ID
) flags
(primary key flag_ID
) とobject_flags
(cross-tabel between objects
and flags
with some extra info)の3 つのテーブルがあります。
すべてのフラグを返すクエリがあり、特定のオブジェクトに特定のフラグがある場合は 1 または 0 を返します。
SELECT
f.*,
of.*,
of.objectID IS NOT NULL AS object_has_flag,
FROM
flags f
LEFT JOIN object_flags of
ON (f.flag_ID = of.flag_ID) AND (of.object_ID = :objectID);
アプリケーション(Delphi で作成)では、すべての行がコンポーネントにロードされます。ユーザーは、テーブルのチェック ボックスをクリックしてデータを変更することにより、フラグを割り当てることができます。
1 行が編集されたとします。object_has_flag の値に応じて、次のことを行う必要があります。
- object_has_flag が true であり、まだ true である場合は、objects_flags の関連する行で UPDATE を実行する必要があります。
- object_has_flag が false でしたが、現在は true であり、INSERT を実行する必要がある場合
- object_has_flag が true でしたが、現在は false の場合、行を削除する必要があります
これは、1 つのクエリhttps://stackoverflow.com/questions/7927114/conditional-replace-or-delete-in-one-queryでは実行できないようです。
MyDAC の TMyQuery をデータセットとして使用しています。行への変更を保存するために必要なクエリを実行する別のコードを作成しましたが、これをデータセットに結合するにはどうすればよいですか? どのイベント ハンドラーを使用する必要がありますか? また、投稿ではなく更新するように TMyQuery に指示するにはどうすればよいですか?
編集:明らかに、問題が何であるかは完全には明らかではありません。標準の UpdateSQL、DeleteSQL、および InsertSQL は使用できません。これは、行を編集した後 (行を削除したり、行を挿入したりせずに)、INSERT
またはDELETE
を実行する必要がある場合があるためです。