2

私のクエリは次のとおりです。

Select h.ord_no
from sales_history_header h
INNER JOIN sales_history_detail d
ON d.NUMBER = h.NUMBER 
WHERE d.COMMENTS LIKE '%3838CS%'

そして、ここに示すように結果が得られません:

ここに画像の説明を入力

しかし、次の理由で結果を取得する必要があります。

私はクエリを実行しました:

Select NUMBER, Comments from SALES_HISTORY_DETAIL WHERE NUMBER LIKE '%0000125199%'

これを取得しました(ご覧のとおり、3838CSが含まれるコメントフィールドがあります):

ここに画像の説明を入力

そして、このクエリを実行しました:

Select NUMBER, Ord_No from "SALES_HISTORY_HEADER" WHERE NUMBER = '0000125199'

これを取得しました(Ord_Noが存在します):

ここに画像の説明を入力

最初の元のクエリが結果を返さないのはなぜですか? 構文が間違っていますか?

4

4 に答える 4

3

実行エンジンがこの特定のアプリケーション (Sage BusinessVision) によって誤って参照されているインデックスを使用しているため、クエリは何も返しません。この問題を回避する必要があります。

説明:

あなたが抱えている問題は、BusinessVisionがテーブル SALES_HISTORY_DETAILのインデックスインデックスを作成した方法に関連しています。このテーブルの PK (インデックス キー 0) は、列NUMBERRECNOの両方にあります。

BusinessVision のパーベイシブ インデックスの詳細

index が BV で機能する方法の説明は次のとおりです。

インデックスを使用できるクエリを実行すると、パフォーマンスが向上します。残念ながら、パーベイシブがNUMBERのこのインデックスを計算する方法は、単独では機能しません。

--wrong way for this table
Select * from SALES_HISTORY_DETAIL WHERE NUMBER = '0000125199'
--return no result

pervasive がインデックスを処理する方法のため、結果が得られないはずです。回避策は、PK を機能させるために、PK のすべてのフィールドに対してクエリを実行する必要があることです。この場合、 RECNOは 1 から 999 までのレコードを表すため、RECNO > 0のすべてのレコードを指定できます。

--right way to use index key0
Select * from SALES_HISTORY_DETAIL WHERE NUMBER = '0000125199' and RECNO > 0

これにより、そのテーブルで期待した結果が得られ、パフォーマンスが向上したインデックスを使用できます。

テーブル SALES_ORDER_DETAIL でも同じ動作になることに注意してください。

質問を返します。

詳細を確認するために実行したクエリは、インデックスを使用する代わりにテーブル スキャンを実行しました。

--the way you used in your question
Select * from SALES_HISTORY_DETAIL WHERE NUMBER LIKE '%0000125199%'

その場合、Like キーワードのためではなく、先頭の「%」のために機能します。それを削除すると、エンジンが奇妙なインデックスを使用して最適化するため、そのクエリは機能しません。

元のクエリでは、d.NUMBER = h.NUMBER pervasive を参照しているため、インデックスを使用して結果が得られないため、そのクエリを修正するには、単に追加します (および RECNO > 0)

Select h.ord_no
from sales_history_header h
INNER JOIN sales_history_detail d
ON d.NUMBER = h.NUMBER and RECNO > 0
WHERE d.COMMENTS LIKE '%3838CS%'

于 2013-07-08T21:32:55.143 に答える
1

これは、両方のテーブルで数値のデータ型が異なるためだと思います

于 2013-06-26T04:54:47.390 に答える