2009-07-28 1 views
2

タイトルによれば、この問題はMS Access 2003 SP1で発生します。誰もがこの問題の解決策を知っていますか?MS Access Inner Joinは小文字と大文字の違いを認識しませんか?

疑似クエリ 内側のSELECT * FROMは、私はAccessでSQLは、大文字と小文字は区別されていないことを信じてa.id = b.id

+1

ここで間違ったクエリを投稿した場合に役立つと思います。 – innaM

答えて

3

小さなデータセットの場合、可能なさまざまな文字列変換を使用する方法はいくつでもあります。

ただし、データセットのサイズがまったくない場合は、インデックスを使用できないため、非常に遅くなります。

あなたはおそらく、小文字を区別せずにケースに参加して、ケースが同じであるかどうかをテストするための基準を使って、例えばを最適化することができます:

SELECT * 
    FROM a INNER JOIN b ON a.id=b.id 
    WHERE Asc(a.id) <> Asc(b.id) 

これは、少なくともあなたがいないだろう、インデックスの使用が参加できるようになります"a"と "a"と "a"を "a"と "a"と "c"(文字列関数を結合する場合のように)と比較することができます。

データが大文字と小文字を区別する必要がある場合は、結合で大文字と小文字を区別できるデータベースエンジンに格納してから、そのデータベースエンジンへのSQLのパススルーをパススルークエリなど)。

EDIT:

@apenwarrは(私が同じテーブルを使用するために、彼女/彼のSQLを更新しました(昨日@butterchickenなかったとして)、JOINでStrComp関数を()を使用して、このSQLが私のために問題を提起示唆私は上記の使用フィールド名;それは、本質的にbutterchickenのSQL @と同じです)

SELECT * 
    FROM a INNER JOIN b 
    ON a.id = b.id 
    AND StrComp(a.id, b.id, 0) = 0 

ジェット句(すなわち、暗黙的には同等のものを最適化するだろうインデックスに登録しようとまったく同じ方法を最適化するという事実でありますJOIN)。ただ(おそらくインデックスフィールドに)参加するにはダウン剥奪、これら2つのSQLステートメントは、ジェットによって同じように最適化されます。

SELECT * 
    FROM a INNER JOIN a 
    ON a.id = b.id 

    SELECT * 
    FROM a, b 
    WHERE a.id = b.id 

私の質問は、これらの3つは同じよう最適化するかどうかではありません。

SELECT * 
    FROM a INNER JOIN b 
    ON a.id = b.id 
    AND StrComp(a.id, b.id, 0) = 0 

    SELECT * 
    FROM a INNER JOIN b 
    ON a.id = b.id 
    WHERE StrComp(a.id, b.id, 0) = 0 

    SELECT * 
    FROM a, b 
    WHERE a.id = b.id 
    AND StrComp(a.id, b.id, 0) = 0 

私は明日のためにするべき仕事を避けるために使用していますので、サンプルデータベースを作成してこれをテストするためのSHOWPLANを設定する時間はありませんが、OPは間違いなくそれを試して報告してください結果(彼/彼女はJetでこれを行う意思があると仮定します)。

+0

+1「アクセスデータベースエンジンを使用しないでください」推奨:) – onedaywhen

+0

時には選択できないことがあります。あなたはあなたが持っているものを持っています。私はMS SQL Server 2000/05/08、Oracle 9g、10g、MySQLで作業しています。レガシーシステムと呼ばれるIT業界には何かがあります...このアクセスは遺産です。 – nemke

1

ここにはanother possible solutionです。投稿に記載されているように、あなたはスピードを犠牲にしています...

2

StrCompを試しましたか?ないアクセス-BODが、私は、クエリは次のようなものに見えると思います:

SELECT * FROM MyTable A INNER JOIN MyTable B 
on StrComp(A.description,B.description, 0) = 0 

StrComp0引数は、(例えば)バイナリは、「あなた」の違いをキャッチしますどの比較引き起こし、「あなたを」。

+0

StrCompはインデックスを使用しないため、非常に大きなデータセットでは使用できません。 –

0

StrCompを使用するための以前の提案の変形ですが、を使用してインデックスを使用して結合を絞り込み、StrCompを使用してさらに制限します。

SELECT * FROM MyTable A INNER JOIN MyTable B 
on A.description = B.description 
AND StrComp(A.description,B.description, 0) = 0 

これは、限り、あなたはたくさんのみ場合によって区別されているエントリのを持っていないとしても大規模なデータセットに高速である必要があります。

関連する問題