3

サブクエリが何も返さない場合、どうすれば0>All()リターンできますか?false論理的には、私の場合、all()に何もない場合、All()を0未満にすることはできません。

例:

select x from table 
where  0 > ALL(complex subquery)

空のリストに対してfalseを返すようにこれを変更するにはどうすればよいですか。サブクエリは長くて複雑なので、exists()の場合と0> ALL()の場合の2回繰り返したくありません。

4

3 に答える 3

3

使用できます

select x 
from table
where  x > (SELECT MAX(foo) 
                 FROM complex_subquery 
                 HAVING COUNT(*) = COUNT(foo))

サブクエリが行を返さない場合、がselect MAX(foo)返され、NULLx > NULL評価されるunknownため、 によって返されませんWHERE

NULLの値がある場合、正しいセマンティクスが維持されるように、クエリが行を返さないことを保証するためfooの句があります( @hvdで指摘されているように)HAVINGALL

于 2012-09-05T11:26:47.417 に答える
2

(これよりも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)

これは、サブクエリがテーブルと関連付けられていない場合にのみ機能します。

于 2012-09-05T11:24:41.100 に答える
0

この複雑なサブクエリがメインクエリに依存していない限り、テーブル変数/一時テーブルに返された値を常に格納し、complex queryそれをメインクエリで使用できますか?

さらに、複雑なクエリにCTEを使用することを検討し、そのような方法でコードを再利用することもできます。

共通テーブル式 (CTE) は、単一の SELECT、INSERT、UPDATE、DELETE、または CREATE VIEW ステートメントの実行範囲内で定義される一時的な結果セットと考えることができます。CTE は、オブジェクトとして格納されず、クエリの間だけ存続するという点で、派生テーブルに似ています。派生テーブルとは異なり、CTE は自己参照することができ、同じクエリで複数回参照できます。

于 2012-09-05T11:11:38.113 に答える