サブクエリが何も返さない場合、どうすれば0>All()
リターンできますか?false
論理的には、私の場合、all()に何もない場合、All()を0未満にすることはできません。
例:
select x from table
where 0 > ALL(complex subquery)
空のリストに対してfalseを返すようにこれを変更するにはどうすればよいですか。サブクエリは長くて複雑なので、exists()の場合と0> ALL()の場合の2回繰り返したくありません。
サブクエリが何も返さない場合、どうすれば0>All()
リターンできますか?false
論理的には、私の場合、all()に何もない場合、All()を0未満にすることはできません。
例:
select x from table
where 0 > ALL(complex subquery)
空のリストに対してfalseを返すようにこれを変更するにはどうすればよいですか。サブクエリは長くて複雑なので、exists()の場合と0> ALL()の場合の2回繰り返したくありません。
使用できます
select x
from table
where x > (SELECT MAX(foo)
FROM complex_subquery
HAVING COUNT(*) = COUNT(foo))
サブクエリが行を返さない場合、がselect MAX(foo)
返され、NULL
にx > NULL
評価されるunknown
ため、 によって返されませんWHERE
。
NULL
の値がある場合、正しいセマンティクスが維持されるように、クエリが行を返さないことを保証するためfoo
の句があります( @hvdで指摘されているように)HAVING
ALL
(これよりもMartin Smithの回答をお勧めします。)
1 つのオプションは CTE です。
; with CteAlias as
(
... complex subquery ...
)
select col1
from table
where exists (select * from CteAlias)
and x > ALL (select col1 from CteAlias)
これは、サブクエリがテーブルと関連付けられていない場合にのみ機能します。
この複雑なサブクエリがメインクエリに依存していない限り、テーブル変数/一時テーブルに返された値を常に格納し、complex query
それをメインクエリで使用できますか?
さらに、複雑なクエリにCTEを使用することを検討し、そのような方法でコードを再利用することもできます。
共通テーブル式 (CTE) は、単一の SELECT、INSERT、UPDATE、DELETE、または CREATE VIEW ステートメントの実行範囲内で定義される一時的な結果セットと考えることができます。CTE は、オブジェクトとして格納されず、クエリの間だけ存続するという点で、派生テーブルに似ています。派生テーブルとは異なり、CTE は自己参照することができ、同じクエリで複数回参照できます。