我已经阅读了阅读和阅读,但我还没有找到解决我的问题的方法。
我正在做类似的事情:
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
但如果有适当的权利,我会使用Nicholas 的回答。
要显示值列表中哪些值未找到匹配项,作为方法之一,您可以创建嵌套表 SQL(schema object) 数据类型:
-- 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
没有简单的方法可以将“外部提供的”列表转换为可用于进行比较的表格。一种方法是使用一种(未记录的)系统类型根据提供的值动态生成表:
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;
有一些方法可以获得您所描述的内容,但它们的要求超出了问题的陈述。从提供的最小描述来看,没有办法让 SQL 返回不匹配的手动输入值的列表。
例如,如果可以将手动输入的值插入到一个单独的表中——让我们称之为它matchtbl
,并命名为列b
——那么以下应该可以完成这项工作:
SELECT matchtbl.b
FROM matchtbl
WHERE matchtbl.b NOT IN (SELECT distinct b
FROM t1)
b
当然,如果数据是由编程语言处理的,通过将列添加到输出中,然后执行集合差异,跟踪原始查询返回的值集应该相对容易。
将列表放在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;