4

MS Access 2010データベースには、TBLIndividualsとTblIndividualsUpdatesの2つのテーブルがあります。それらには多くの同じデータがありますが、両方のテーブルの特定の人のレコードの主キーが同じでない場合があります。そのため、名前と生年月日の2つのテーブルを結合して、どちらのレコードが対応しているかを確認しています。左結合を使用しているので、TblIndividualsUpdatesにはあるが、TBLIndividualsにはない人々の行も取得します。そうすれば、最新の状態にするためにTBLIndividualsに追加する必要のあるレコードを知ることができます。

SELECT TblIndividuals.PersonID AS OldID, 
TblIndividualsUpdates.PersonID AS UpdateID
FROM TblIndividualsUpdates LEFT JOIN TblIndividuals 
ON ( (TblIndividuals.FirstName = TblIndividualsUpdates.FirstName) 
and (TblIndividuals.LastName = TblIndividualsUpdates.LastName) 
AND (TblIndividuals.DateBorn = TblIndividualsUpdates.DateBorn 
    or (TblIndividuals.DateBorn is null 
        and (TblIndividuals.MidName is null and TblIndividualsUpdates.MidName is null 
            or TblIndividuals.MidName = TblIndividualsUpdates.MidName))));

TblIndividualsUpdatesには4149行がありますが、クエリは4103行しか返しません。TblIndividualsUpdatesには約50の新しいレコードがありますが、OldIDがnullであるクエリ結果には4行しかありません。

AccessからPostgreSQLにデータをエクスポートし、そこで同じクエリを実行すると、4149行すべてが取得されます。

これはAccessのバグですか?Accessの左結合セマンティクスとPostgreSQLのセマンティクスに違いはありますか?データベースが破損していませんか(コンパクトと修復は役に立ちません)?

4

4 に答える 4

4
ON ( 

        TblIndividuals.FirstName = TblIndividualsUpdates.FirstName

        and 

        TblIndividuals.LastName = TblIndividualsUpdates.LastName

        AND (
                 TblIndividuals.DateBorn = TblIndividualsUpdates.DateBorn      
                 or 
                 (
                     TblIndividuals.DateBorn is null          
                     and 
                     (
                     TblIndividuals.MidName is null 
                     and TblIndividualsUpdates.MidName is null              
                     or TblIndividuals.MidName = TblIndividualsUpdates.MidName
                     )
                 )
             )
    );

私がすることは、最初の 2 つを除くすべての結合条件を体系的に削除して、レコードが失われるのを見つけることです。そうすれば、どこに問題があるかがわかります。

于 2012-04-24T17:49:51.650 に答える
3

これは決して起こらないはずです。その間に行が挿入/削除されていない限り、

クエリ:

SELECT *
FROM a LEFT JOIN b
         ON whatever ;

以下よりも少ない行を返すことはありません:

SELECT *
FROM a ;

それが起こるなら、それはバグです。クエリがこれとまったく同じであると確信していますか (また、WHERE句などの詳細を省略していませんか)? 最初のものは 4149 行を返し、2 番目のものは 4103 行を返しますか? *上記を に変更することで、別のチェックを行うことができますCOUNT(*)

于 2012-04-24T17:55:03.627 に答える
1

これらのJOINフィールド(FirstName、LastName、およびDateBorn)を含む両方のテーブルからすべてのインデックスを削除します。次に、この簡略化されたクエリで期待される4,149行を取得できるかどうかを確認します。

SELECT
    i.PersonID AS OldID, 
    u.PersonID AS UpdateID
FROM
    TblIndividualsUpdates AS u
    LEFT JOIN TblIndividuals AS i
    ON
        (
            (i.FirstName = u.FirstName) 
        AND (i.LastName = u.LastName) 
        AND (i.DateBorn = u.DateBorn)
        );
于 2012-04-24T17:39:06.550 に答える
0

なんにせよ、これは欺瞞的なバグのようであり、追加情報があれば解決に役立つ可能性があるため、私は同じ問題を抱えていました.

クエリが大きすぎてここに投稿できません。適切なものに縮小する時間はありませんが、見つけたものを報告できます。以下では、すべての結合が左結合です。

クエリを徐々に改良し、変更していました。その中に派生テーブルがありました(D)。そして、全体を派生テーブル (T) にし、最後のテーブル (L) に結合しました。いずれにせよ、その開発のある時点で、D に由来する T のフィールドは L への結合に参加しませんでした。その後、問題が発生し、行の総数が不思議なことにメイン テーブルよりも少なくなりました。これは不可能なはずです。 . D からのフィールドを (T を介して) L への結合に再び参加させるとすぐに、数は再び正常に増加しました。

L への結合に (T を介して) 参加しているフィールドがない場合、D への結合条件が WHERE 句に移動されたかのようでしたが、その説明が何であるかはよくわかりません。

于 2014-05-05T21:53:54.920 に答える