私は2つのテーブルを持っています:
Vehicles
make model modification
Audi A 5 A 5 2010 Sportsback 2.8
Audi A 5 A 5 2012 Quattro L
Audi A 5 A 5 Cabriolet
と
matchingModel
make model modContain modEnd finalModel
Audi A 5 Sportback A5 Sportback
Audi A 5 L A5 L
Audi A 5 A5
私の仕事は、一致を見つけることによって最適な finalModel のみを取得することです (以下の選択で確認できます)。最初にテーブルを結合しようとしました
(SELECT
matchingModel.finalModel
FROM vehicles
LEFT OUTER JOIN matchingModel ON
matchingModel.TEXT1 = vehicles.make
AND vehicles.model = nvl(matchingModel.model,vehicles.model)
AND vehicles.modification LIKE decode(matchingModel.modContain, NULL, vehicles.modification, '%'||matchingModel.modContain||'%')
AND vehicles.modification LIKE decode(matchingModel.modEnd, NULL, vehicles.modification, '%'||' '||matchingModel.modEnd)
)
AS bestMatch
しかし、それはうまくいきませんでした。Sportsback が Sportsback として見つかったので、後で単純な A5 として上書きされたからです。
次に、すべての可能なオプションを「nvling」することでこれを実現しました: modEnd は Modification の終了に似ており、modEnd は空ではありません), (make とモデルが適合する場所を選択するなど)) AS Bestmatch これは機能しますが、非常に低速です (両方のテーブルに 500k を超えるレコードがあります)。
これは非常に巨大な select の一部にすぎないため、この通常の方法で書き直すのは困難です。とにかく、問題は、Oracleでベストマッチを1回だけ高速で取得するベストプラクティスはありますか? modContain または modEnd が空かどうかわからないため、私が遭遇した問題は、パフォーマンス、または値が 2 回適合するか、「where」句が機能しないことです。
前もって感謝します。英語で申し訳ありません。