テーブルの列にあるかどうかを知る必要があるエントリのリストがあります。それは簡単ですが、このリストのエントリが DB 列に表示されない場合にマークする方法がわかりません。また、可能であれば、各要素の Db 列の結果の数を知っています。リストの要素が DB 列に表示されない場合、出力は 0 でなければなりません。
私がリストを言うとき、それはそれです:
select xxxxxx from TABLE WHERE field in (a, b, c, d, ... , z);
(グローバル) 一時テーブルまたはネストされたテーブル オブジェクトを使用します。
一時テーブル ( 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;
これを行うには、最初に、カウントされる値のリストが何であるかを知る方法が必要です。これを何らかの方法で自分で生成し、何らかの説明のサブクエリに保存するか、この情報を使用してテーブルまたはビューを作成する必要があります。
その後、メイン テーブルに参加して、数字を計算できます。
次の表を例として使用します。
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
にあった列の値の数のカウントが必要な場合は、次のようになります。a
l
m
p
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 です。カウントしたい生成された値のリストがあり、関心のある列にそれらが存在するかどうかを確認します。