3

我已经阅读了阅读和阅读,但我还没有找到解决我的问题的方法。

我正在做类似的事情:

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

当然还有其他条件,但这就是它的要点。

我的问题是:有没有办法显示在手动输入的值列表中没有找到匹配项?我看过,但找不到,我在兜圈子。

4

5 回答 5

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 的回答

于 2013-08-29T19:42:52.290 回答
2

要显示值列表中哪些值未找到匹配项,作为方法之一,您可以创建嵌套表 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

SQLFiddle 演示

于 2013-08-29T20:18:10.440 回答
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;
于 2013-08-29T20:33:45.667 回答
0

有一些方法可以获得您所描述的内容,但它们的要求超出了问题的陈述。从提供的最小描述来看,没有办法让 SQL 返回不匹配的手动输入值的列表。

例如,如果可以将手动输入的值插入到一个单独的表中——让我们称之为它matchtbl,并命名为列b——那么以下应该可以完成这项工作:

SELECT matchtbl.b
FROM matchtbl
WHERE matchtbl.b NOT IN (SELECT distinct b
                         FROM t1)

b当然,如果数据是由编程语言处理的,通过将列添加到输出中,然后执行集合差异,跟踪原始查询返回的值集应该相对容易。

于 2013-08-29T20:01:40.140 回答
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;
于 2013-08-29T20:50:43.883 回答