4

Access データベースに2 つのテーブルabがあります。両方のテーブルにフィールド ID があります。ただし、テーブルa では、ID フィールドの先頭に「31」が付いていますが、テーブルbの ID フィールドにはありません。

たとえば

table a                 table b

ID      field2          ID     field3
31L123  test123         L123   123test
31L122  test321         L122   321test

接頭辞付きのフィールド テーブルは、Excel エクスポートから定期的にインポートされます。Excel レベルで接頭辞を削除できることは理解していますが、SQL 内の結合で何らかの連結関数を使用して、ID フィールドで 2 つのテーブルを結合する方法はありますかひょっとして発言?

たとえば、次のようなものがあります。

SELECT Id, Field2, Field3 
FROM a LEFT JOIN b ON CONCATENATE('31', a.ID) = b.ID
WHERE a.Field2 = 13

これが正しいアプローチであるかどうかはわかりません。そのため、問題に関する既存のヘルプが見つからないようです(インポート前にExcelレベルでフィールドを処理することを無視します)。

4

3 に答える 3

4

CONCATENATE()Access SQL ではサポートされていません。通常&、連結に使用します。

ONただし、結合の条件のために何も連結する必要はないと思います。Mid()最初の2文字を無視するために使用するだけです...

ON Mid(a.ID, 3) = b.ID

これは機能するはずですが、時間の経過とともにテーブルが大きくなると、パフォーマンスが許容できなくなる可能性があります。a.ID各インポートの直後に値を「クリーニング」することで、パフォーマンスが向上するはずです...

UPDATE a
SET ID = Mid(ID, 3)
WHERE ID ALike '31%';

次に、SELECTクエリの結合で、より単純で高速なON条件を使用できます...

ON a.ID = b.ID

ID最適なパフォーマンスを実現するためにインデックスが作成されていることを確認してください。

于 2016-03-17T14:49:06.077 に答える
1

クエリを次のように更新してみませんか。

SELECT Id, Field2, Field3 
FROM a LEFT JOIN b ON RIGHT(a.ID,4) = b.ID
WHERE a.Field2 = 13

また、a.ID を取得して、a.ID の長さから 2 桁を減算し、a.ID が 6 文字幅より長い場合は、右端の文字を使用することもできます。そして、書き直すと、次のようになります。

SELECT Id, Field2, Field3 
FROM a LEFT JOIN b ON RIGHT(a.ID,LEN(a.ID)-2) = b.ID
WHERE a.Field2 = 13

お役に立てれば?

于 2016-03-17T14:48:52.493 に答える
0

I would just add the "31" using MS Access's string concatenation:

SELECT Id, Field2, Field3 
FROM a LEFT JOIN
     b
     ON ("31" & a.ID) = b.ID
WHERE a.Field2 = 13;

Some databases would still use an index on b.ID for this query.

于 2016-03-17T14:58:47.943 に答える