0

コードを絞り込みましたが、直面している問題は、コードを調整してより多くの結果を含めようとするときです。

参照用データ表:

**OG_InUse**
*C_ID*
E011
E011_A
F012_D


**Csrc**
*C_ID*
E011
F012
G001

したがって、「_*」がある場合、機能するが結果を返さないコード

sSql = "SELECT DISTINCT C_ID FROM Csrc WHERE C_ID NOT IN (SELECT DISTINCT C_ID FROM OG_InUse)"

結果: F012 G001

上記のクエリを拡張して、OG_InUse から C_ID の最初の 4 文字だけを返そうとすると、問題が発生します (_A または _D などがあるケースを削除するため)。

sSql = "SELECT DISTINCT C_ID FROM Csrc WHERE C_ID NOT IN (SELECT DISTINCT Left(C_ID, 4) AS C_OG_ID FROM OG_InUse)"

次の結果になりたいです(ただし、アクセスは処理を試行し続けます):G001

クエリがそのようにつまずく原因となっている可能性のある提案はありますか? 私の最初の考えはエイリアスをチェックインすることですが、これを分割する以外にこれをテストする方法がわかりません(これを実行し、サブクエリは正しい結果セットを返します)。

4

2 に答える 2

1

テーブルのサイズに関する詳細情報を考えると、次のようになります。

  1. やがてアクセスが尽きる

  2. OG_InUse.C_ID のサフィックスを別のフィールドに分けることができれば、クエリはより最適化される可能性があります (しかし、それが努力を正当化するかどうかはわかりません...)

于 2013-03-22T20:40:33.437 に答える
1

EXISTSの代わりに を使用して、常に SQL ソリューションを見つけるようにしてくださいINLIKE必要なクエリでは、キーワードを使用する必要があります。例えば:

SELECT DISTINCT C_ID
FROM  CSrc
WHERE NOT EXISTS
(
    SELECT *
    FROM OG_InUse
    WHERE OG_InUse.C_ID LIKE (CSrc.C_ID + '*')
)

編集

  1. これを実行するには、OG_InUse の C_ID がインデックス化されていることを確認する必要があります。
  2. DISTINCT順序付けされた結果については、元のキーワードを復元できます。結果を並べ替えます(これを表示するように回答を修正しました)

さらに編集

EXISTS多くの場合、同じ結果を得るためにサブクエリを完全に評価する必要がないため、CPU と実行時間が削減されるINため、通常はサブクエリよりも優先されます。EXISTSこの場合、SELECT *最初に一致する OG_InUse を見つけるためにサブクエリを評価するだけで済みます。つまり、SELECT *完全に評価する必要はありません。

于 2013-03-22T20:00:53.870 に答える