SQL ステートメントと (Delphi の ADO)Query コンポーネントの操作や (Access 2003) データベース内のフィールド間の関係の設定について、何か基本的なことが欠けていると思います。SQL.Text="SELECT something FROM aTable." よりも複雑なものを削除、更新などしようとすると、エラー メッセージが表示されます。
たとえば、Outline と Reference というテーブル間に単純な多対多のリレーションシップを作成しました。ジャンクションまたは結合テーブルは、注:
Outline
OutlineID (PK)
etc.
Reference
RefID (PK)
etc.
Note
NoteID (PK)
OutlineID
RefID
NoteText
Access の結合に参照整合性を強制しましたが、削除または更新をカスケードするためのチェックボックスをオンにしませんでした。一方、Delphi では、私の Query.SQL.Text は
SELECT Note.NoteID, Outline.OutlineID, Ref.RefID, Note.NoteText, Ref.Citation, Outline.OutlineText
FROM (Note LEFT JOIN Outline ON Outline.OutlineID=Note.OutlineID)
LEFT JOIN Ref on Ref.RefID=Note.RefID;
最初は、SELECT ステートメントでキーへの参照を省略していたため、結果のテーブルからレコードを削除しようとすると、「キー列情報が不足しています」というエラーが発生しました。私は理解していると思います:実行を求められる操作のためにデータベースが必要とするすべてのフィールドを選択する必要があります。何が何に結合されているのかわからない場合、結合されたフィールドを削除、更新などすることはできません。(これは正しいですか?)
では、このクエリからレコードを削除するにはどうすればよいでしょうか。つまり、(1) NoteText、Citation、および OutlineText を示すグリッドを表示し、(2) グリッドからレコードを選択し、(3) DBNavigator の [削除] ボタンをクリックするなどの操作を行い、(4) 削除したい選択したレコードと同じ NoteID と NoteText を持つ Note テーブルのレコード。