ALL
サブクエリを含むWHERE
句の条件があります。サブクエリの結果が空の場合は、式は常にtrue
と評価されますが、評価する値はfalse
です。postgresql ALLサブクエリーが空で真に評価されます
たとえば、ドライバのテーブル、ルートのテーブル、および各ドライバが駆動したルートを示す多対多の対話テーブルがあるとします。私は、50マイル以上のルートしか運転していないドライバーを探したい。
SELECT * FROM driver
WHERE 50 < ALL(
SELECT miles FROM route, driver_route
WHERE driver_route.route_id = route.id AND
driver_route.driver_id = driver.id)
このクエリには、結果にルートが表示されていないドライバが含まれますが、これは私が望まないものです。
私はcoalesceを使ってみましたが、ERROR: more than one row returned by a subquery used as an expression
に走りました。
SELECT * FROM driver
WHERE 50 < COALESCE((
SELECT ALL(SELECT miles FROM route, driver_route
WHERE driver_route.route_id = route.id AND
driver_route.driver_id = driver.id)),
0);
私はさまざまな種類とクエリに適用されるのに十分一般的だ構造を探しています:ここでは、私はそのクエリを言葉で表現する方法です。
感謝を。結果は同じです。私が正しく理解していれば、このクエリには空の結果が明示的に含まれています。これは私が避けようとしているものです。 – user3747260
@ user3747260は、少なくとも1つの「マイル> 50」を要求するために「AND EXISTS」に適合しています。もちろん、 – flutter
です。重複しているにもかかわらず、クエリプランナーはこれをうまく処理しているようです。私はこれが一般的な問題ではなく、より標準的な解決策ではないことに驚いていると言わなければならないが、あなたはうまくいくようだ。ありがとう。 – user3747260