返回没有匹配的行

时间:2013-08-29 19:37:04

标签: sql oracle

我已阅读,阅读和阅读,但我找不到解决问题的方法。

我正在做类似的事情:

SELECT a
FROM t1
WHERE t1.b IN (<external list of values>)

当然还有其他条件,但这是它的主旨。

我的问题是:有没有办法显示手动输入的值列表中哪些找不到匹配?我看了,但我找不到了,而且我要去看看。

5 个答案:

答案 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

SQLFiddle Demo

答案 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;