私は読んで読んで読んだが、私の問題の解決策を見つけていない.
私は次のようなことをしています:
SELECT a
FROM t1
WHERE t1.b IN (<external list of values>)
もちろん他にも条件はありますが、大まかに言うとこんな感じです。
私の質問は: 手動で入力した値のリストで一致が見つからなかったものを表示する方法はありますか? 私は見ましたが、見つけることができず、ぐるぐる回っています。
外部の値リストを使用して一時テーブルを作成すると、次のことができます。
select item
from tmptable t
where t.item not in ( select b from t1 )
リストが十分に短い場合は、次のようなことができます。
with t as (
select case when t.b1='FIRSTITEM' then 1 else 0 end firstfound
case when t.b1='2NDITEM' then 1 else 0 end secondfound
case when t.b1='3RDITEM' then 1 else 0 end thirdfound
...
from t1 wher t1.b in 'LIST...'
)
select sum(firstfound), sum(secondfound), sum(thirdfound), ...
from t
しかし、適切な権利があれば、ニコラスの答えを使用します。
値のリストで一致が見つからなかった値を表示するには、アプローチの 1 つとして、ネストされたテーブル SQL (スキーマ オブジェクト) データ型を作成できます。
-- assuming that the values in the list
-- are of number datatype
create type T_NumList as table of number;
次のように使用します。
-- sample of data. generates numbers from 1 to 11
SQL> with t1(col) as(
2 select level
3 from dual
4 connect by level <= 11
5 )
6 select s.column_value as without_match
7 from table(t_NumList(1, 2, 15, 50, 23)) s -- here goes your list of values
8 left join t1 t
9 on (s.column_value = t.col)
10 where t.col is null
11 ;
結果:
WITHOUT_MATCH
-------------
15
50
23
「外部から提供された」リストを、比較に使用できる表に変換する簡単な方法はありません。1 つの方法は、(文書化されていない) システム タイプの 1 つを使用して、指定された値に基づいてその場でテーブルを生成することです。
with value_list (id) as (
select column_value
from table(sys.odcinumberlist (1, 2, 3)) -- this is the list of values
)
select l.id as missing_id
from value_list l
left join t1 on t1.id = l.id
where t1.id is null;
リストをin
句に入れると、これが難しくなります。リストをテーブルに入れることができれば、次のように機能します。
with list as (
select val1 as value from dual union all
select val2 from dual union all
. . .
select valn
)
select list.value, count(t1.b)
from list left outer join
t1
on t1.b = list.value
group by list.value;