1

テーブルの列にあるかどうかを知る必要があるエントリのリストがあります。それは簡単ですが、このリストのエントリが DB 列に表示されない場合にマークする方法がわかりません。また、可能であれば、各要素の Db 列の結果の数を知っています。リストの要素が DB 列に表示されない場合、出力は 0 でなければなりません。

私がリストを言うとき、それはそれです:

select xxxxxx from TABLE WHERE field in (a, b, c, d, ... , z);
4

2 に答える 2

2

(グローバル) 一時テーブルまたはネストされたテーブル オブジェクトを使用します。

  • 一時テーブル ( SQLFiddle デモ)

    CREATE GLOBAL TEMPORARY TABLE tmp (field NUMBER);
    
    INSERT INTO tmp (...);
    
    SELECT tmp.field, COUNT(t.field)
      FROM table t
     RIGHT JOIN tmp ON t.field = tmp.field
     GROUP BY tmp.field;
    
  • テーブル オブジェクト (デモ)

    CREATE OR REPLACE TYPE tab AS TABLE OF NUMBER;
    /
    
    SELECT tmp.column_value field, COUNT(t.field)
      FROM table t
     RIGHT JOIN TABLE(tab(a,b,c,d,e)) tmp ON t.field = tmp.column_value
     GROUP BY tmp.column_value;
    
于 2012-11-20T13:43:34.153 に答える
2

これを行うには、最初に、カウントされる値のリストが何であるかを知る方法が必要です。これを何らかの方法で自分で生成し、何らかの説明のサブクエリに保存するか、この情報を使用してテーブルまたはビューを作成する必要があります。

その後、メイン テーブルに参加して、数字を計算できます。

次の表を例として使用します。

create table tmp_test ( numbers number, letters varchar2(1));

、次のようにデータが入力されています。

 insert into tmp_test
 select mod(level, 500), chr(mod(level,13) + 97) 
   from dual
connect by level <= 1000

求めている値が 95 から 105 の間の数値であると仮定すると、クエリは次のようになります。

select all_vals, count(b.numbers)
  from ( select level + 94 as all_vals
           from dual
        connect by level <= 11
                ) a
  left outer join tmp_test b
    on a.all_vals = b.numbers
 group by a.all_vals
 order by all_vals
       ;

  ALL_VALS COUNT(B.NUMBERS)
---------- ----------------
        95               10
        96               10
        97               10
        98               10
        99               10
       100                0
       101                0
       102                0
       103                0
       104                0
       105                0

11 rows selected.

ただし、 、、およびiflettersにあった列の値の数のカウントが必要な場合は、次のようになります。almp

select all_vals, count(b.letters)
  from ( select 'a' as all_vals from dual
          union all
         select 'l' from dual
          union all
         select 'm' from dual
          union all
         select 'p' from dual
                ) a
  left outer join tmp_test b
    on a.all_vals = b.letters
 group by a.all_vals
 order by all_vals
       ;

A COUNT(B.LETTERS)
- ----------------
a               76
l               77
m               77
p                0

前述のように、サブクエリはビューまたはテーブルに簡単に置き換えることができます。

ここで違いを生むのは LEFT OUTER JOIN です。カウントしたい生成された値のリストがあり、関心のある列にそれらが存在するかどうかを確認します。

これらの例を使用した実際のSQL Fiddleを次に示します。

于 2012-11-20T13:40:01.820 に答える