我已阅读,阅读和阅读,但我找不到解决问题的方法。
我正在做类似的事情:
SELECT a
FROM t1
WHERE t1.b IN (<external list of values>)
当然还有其他条件,但这是它的主旨。
我的问题是:有没有办法显示手动输入的值列表中哪些找不到匹配?我看了,但我找不到了,而且我要去看看。
答案 0 :(得分:3)
使用外部值列表创建临时表,然后您可以执行以下操作:
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' answer。
答案 1 :(得分:2)
要显示值列表中的哪些值未找到匹配项,作为方法之一,您可以创建嵌套表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
答案 2 :(得分: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;
答案 3 :(得分:0)
有一些方法可以获得您所描述的内容,但是它们的要求超出了问题的陈述。从提供的最小描述中,没有办法让SQL返回不匹配的手动输入值的列表。
例如,如果可以将手动输入的值插入单独的表格中,请使用名为matchtbl
的列调用b
- 然后以下应该做的工作:
SELECT matchtbl.b
FROM matchtbl
WHERE matchtbl.b NOT IN (SELECT distinct b
FROM t1)
当然,如果数据是由编程语言处理的,那么通过将b
列添加到输出中来跟踪原始查询返回的值集应该相对容易,并且然后执行设定差异。
答案 4 :(得分:0)
将列表放在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;