1

別のフォーラムでこの質問を見たことがありますが、受け入れられる回答がありませんでした。

Groups テーブルと Elements テーブルの 2 つのテーブルがあるとします。テーブルには定義済みの関係がありません。Elements テーブルには、Groups テーブルの IdGroup (PK) フィールドを参照する IdGroup フィールドがあります。

ADO レコードセットを介して次のクエリを使用して、テーブルの値をデータグリッドに入力します。

SELECT Elements.*, Groups.GroupName
FROM Elements
INNER JOIN Groups ON Elements.IdGroup = Groups.IdGroup

そのグリッドから、要素を削除するために Delete キーを押したいと思います。これが私の問題です。DAO を使用したとき、DAO の Delete() 関数は Elements グループのレコードのみを削除しました。これは予期された動作でした。

ADO に変更すると、Delete() 関数によって、要素レコードと要素が属するグループの両方のテーブルのレコードが削除されました。

テーブルにリレーションシップを定義せずに、ADO で DAO の動作を再現する方法はありますか?

注: 代替手段があることは知っています (DELETE クエリを実行すると、うまくいく可能性があります)。ADO でこれを行う方法を教えてください。または、できないと言ってください。

4

1 に答える 1

1

クエリを次のように書き換えます。

  • INNER JOIN を EXISTS で構成される WHERE 句に置き換えます。
  • SELECT 句でサブクエリを使用して、Groups.GroupName の値を返します。

例:

SELECT Elements.*, 
       (
        SELECT Groups.GroupName
          FROM Groups 
         WHERE Elements.IdGroup = Groups.IdGroup
       )
  FROM Elements
 WHERE EXISTS (
               SELECT * 
                 FROM Groups 
                WHERE Elements.IdGroup = Groups.IdGroup
              );

Microsoft OLEDB Datagrid Control(MSDATGRD.OCX)のDataSourceプロパティとして設定されたADOレコードセットを使用してSQL Server 2008を使用してこれをテストし、グリッドを介して行を削除しました(同様のことをしていると思います)。行は実際にテーブル要素のみから削除されます (つまり、グループの行は削除されません)。

修正されたクエリは、行をフェッチするときにパフォーマンスに悪影響を及ぼす可能性があることに注意してください。

于 2009-01-08T12:19:45.017 に答える