2

次のようなクエリがあります。

SELECT ISNULL(MyColumn, "Not Applicable") As MyColumn
FROM MyTable
WHERE SomeOtherColumn =
(SELECT AValue
FROM SomeOtherTable
WHERE SomeConditionHolds
)

MyColumn の関連する値に値がある場合はこれを取得し、null の場合は必要に応じて「適用外」となります。

ただし、サブクエリが空のセットを返す場合があり、その場合、クエリ全体も空のセットを返します。「該当なし」を返してほしいです。

私ができる最善のことは、上記に追加することです

UNION
SELECT 'Not Applicable' AS MyColumn
WHERE NOT EXISTS
    (SELECT AValue
FROM SomeOtherTable
WHERE SomeConditionHolds
)

しかし、これは本当にハックで非効率的です。誰かがより良いアイデアを持っていることを願っています。

4

5 に答える 5

0

サブクエリは 1 つの値を返すため、これを外部結合に簡単に変換できます。これにより、常に行が得られ、クエリがより効率的で洗練されたものになります。

SELECT
    ISNULL(MyColumn, "Not Applicable") As MyColumn
FROM MyTable
LEFT JOIN SomeOtherTable
    ON SomeOtherColumn = AValue
    AND SomeConditionHolds

ここで重要なのは、where 句ではなくSomeConditionHolds結合条件にあることです。それ以外の場合、左結合は実質的に内部結合になります。

于 2013-05-11T04:08:44.837 に答える
0

クエリ結果を取得し、行が存在しない場合は結果を「該当なし」に設定します。それ以外の場合は、再確認してシステム時間を無駄にする必要があります。

于 2013-05-10T19:28:30.447 に答える
0
declare @Foo as Table ( FooId Int Identity, Something VarChar(16) );
insert into @Foo ( Something ) values
  ( 'One' ), ( 'II' ), ( '3' );

declare @FooLimit as Int = 1; -- Try 5.

with Alicia as (
  select FooId, Something, 1 as SetId
    from @Foo
    where FooId >= @FooLimit
  union all
  select 42, 'n/a', 2 )
  select FooId, Something
    from Alicia
    where SetId = ( select Min( SetId ) from Alicia )
于 2013-05-19T02:51:50.603 に答える