0

私はこれを単純に保ちます.別の列にnullがない場合に、列のすべての値を選択する良い方法があるかどうかを知りたい. 例えば。

  A      B
-----  -----

  1      7
  2      7
NULL     7
  4      9
  1      9
  2      9

上記のセットから、7 には A に NULL があるため、7 ではなく B から 9 が必要です。明らかに、これをサブクエリとしてラップし、IN 句などを使用できますが、これはすでにかなりユニークなセットの一部であり、探していますこれを効率的に保つために。

私の目的では、これは一方向の比較にすぎないことに注意してください... B で値を返し、A を調べるだけです。

私が見逃しているこれを行う簡単な方法があると思いますが、今は見当たりません。

4

2 に答える 2

1

次のようなことができます。

select *
from t
where t.b not in (select b from t where a is null);

個別の b 値のみが必要な場合は、次のようにできます。

select b
from t
group by b
having sum(case when a is null then 1 else 0 end) = 0;

最後に、ウィンドウ関数を使用できます。

select a, b
from (select t.*,
             sum(case when a is null then 1 else 0 end) over (partition by b) as NullCnt
      from t
     ) t
where NullCnt = 0;
于 2013-04-01T13:21:43.733 に答える
1

以下のクエリは、最終結果で 1 つの列のみを出力します。レコードは列ごとにグループ化され、レコードがnullBかどうかをテストします。レコードがnullの場合、グループの値は毎回 1 ずつ増加します。句は、値が のグループのみをフィルタリングします。HAVING0

SELECT  B
FROM    TableName
GROUP   BY B
HAVING  SUM(CASE WHEN A IS NULL THEN 1 ELSE 0 END) = 0

レコードからすべての行を取得する場合は、join を使用できます。

SELECT  a.*
FROM    TableName a
        INNER JOIN
        (
            SELECT  B
            FROM    TableName
            GROUP   BY B
            HAVING  SUM(CASE WHEN A IS NULL THEN 1 ELSE 0 END) = 0
        ) b ON  a.b = b.b
于 2013-04-01T13:22:43.280 に答える