:あなたには、いくつかの理由のためのANSI標準のSQLを記述する必要がある場合は、CASE演算子で問題を回避する必要があると思いますクエリ内のArea
列に範囲述部を含めることができます。 Area
列が索引付けされている場合、効率的な索引ベースのアクセスが可能になります。他の枝が最大Area <
あなたのターゲットを持つレコードを見つけながら
(Oracle構文を使用して書かれた)次のクエリは、最小限のArea >=
ターゲットでレコードを検索するUNION ALL
の一方の枝を使用しています。これら2つのレコードのうちの1つが、探しているレコードになります。その後、ORDER BY ABS(Area - ?input)
で2人の候補者の中から勝者を選ぶことができます。残念なことに、クエリは、ROWNUM/ORDER BY優先順位を強制するために必要なネストされたSELECTSのために複雑です。このクエリの
SELECT *
FROM
(SELECT * FROM
(SELECT * FROM
(SELECT * FROM [myTable]
WHERE Name = 'Test' AND Size = 2 AND PType = 'p' AND Area >= ?target
ORDER BY Area)
WHERE ROWNUM < 2
UNION ALL
SELECT * FROM
(SELECT * FROM [myTable]
WHERE Name = 'Test' AND Size = 2 AND PType = 'p' AND Area < ?target
ORDER BY Area DESC)
WHERE ROWNUM < 2)
ORDER BY ABS(Area - ?target))
WHERE rownum < 2
良い指標は、予想クエリ実行プランは、それぞれ単一の行を返した2回の索引レンジ・スキャンに基づくものであろう場合に(Name, Size, PType, Area)
、あろう。
へようこそSOと感謝を選択 !しかし、あなたの答えを改善して役に立つものがいくつかあります。まず、マークアップが壊れています。コードブロックは4つのスペースでインデントする必要があります。[編集ヘルプ](http://stackoverflow.com/editing-help)を参照してください。これとは別に、コードのみの回答は一般的に理解しにくいので、説明は便利です。あなたの答えはSQL擬似コードであると言いますか、それを通常のSQLに書き直すのもいいでしょう。それでも、あなたの答えは有用であり、問題を編集した後、それは上向きになるかもしれません。 – Palec