0

使用したプラットフォーム:

SQL Server 2008 および C++ ビルダー

エラーが発生していた 2 つのテーブル間で内部結合を行っています。

更新する行が見つかりません

クエリ:

SELECT DISTINCT  
    b.Acc, b.Region, b.Off, b.Sale, a.OrgDate
FROM 
    sales b
INNER JOIN 
    dates a ON (a.Acc = b.Acc and a.Region = b.Region and a.year= b.year)
WHERE
    (a.xdate <> a.yDate)
    and (b.Sale = a.SaleDate)
    and b.year = 2010

注: AccRegionOffはテーブル b の主キーであり、テーブル a にも存在します。

テーブル a には、クエリに表示されない主キーである id があります。

私の内部結合が重複した行を返していることが判明しました。

内部結合クエリを「DISTINCT」を使用するように変更して、重複しない行のみが返されるようにしました。クエリは実行されますが、エラーが発生します。

更新またはリフレッシュするためのキー列情報が不十分です。

テーブル A の主キーであるフィールドは、テーブル B のフィールドと同じ名前であることがわかります。

これは、ADO レコード セットの更新中に発生するバグであることがわかりました。BUG: 結合テーブルが同じ列名を共有している場合に ADO 階層レコードセットを更新する際の問題

次の 2 つの質問があります。

  1. 内部結合クエリで Distinct を使用するのは得策ではありませんか?
  2. TADO クエリに関連するバグの解決策を見つけた人はいますか?

ありがとうございました、

4

1 に答える 1

0

これを解決する方法は、手動で更新クエリを作成し、TADOQuery.ExecSQL を介して実行することです。これは、自分が何をしているのかを実際に知っていることを前提としています。

問題は、すべてのフィールドで同じ行の倍数になるレコードセットで作業しているのはなぜですか? クエリを調べて修正する必要があります。DISTINCT は役に立ちません。SQL Server は 1 つのレコードを選択しますが、JOIN の両側でソースを正しく識別するための 十分な情報がないため、ADO は選択したレコードを認識できません。


このクエリはa.id、ソース レコードを識別可能にするために取り込まれます。

SELECT Acc,Region,Off,Sale,OrgDate,id
  FROM
(
SELECT b.Acc,b.Region,b.Off,b.Sale,a.OrgDate, a.id,
       rn=row_number() over (partition by b.Acc,b.Region,b.Off order by a.id asc)
  FROM sales b
  JOIN dates a ON(a.Acc = b.Acc and a.Region = b.Region and a.year= b.year)
 WHERE a.xdate <> a.yDate
   and b.Sale = a.SaleDate
   and b.year = 2010
) X
 WHERE rn=1;

テストされていませんが、ADO で動作するはずです

于 2012-09-30T20:33:18.423 に答える