1

我有一个条目列表,我需要知道它们是否在表格的列中。这很容易,但我不知道如何标记此列表的条目何时未出现在 DB 列中。如果可能知道每个元素的 Db 列中的结果计数。当列表的元素未出现在 DB 列中时,输出必须为 0。

当我说一个列表时,它是:

select xxxxxx from TABLE WHERE field in (a, b, c, d, ... , z);
4

2 回答 2

2

为了做到这一点,您首先需要一种方法来了解要计算的值列表是什么。您必须以某种方式自己生成它并将它们存储在某些描述的子查询中,或者使用此信息创建表或视图。

然后,您可以加入您的主表并计算出数字。

以下表为例:

create table tmp_test ( numbers number, letters varchar2(1));

,其中的数据填充如下:

 insert into tmp_test
 select mod(level, 500), chr(mod(level,13) + 97) 
   from dual
connect by level <= 1000

如果我们假设您所追求的值是 95 到 105 之间的数字,您的查询将是:

select all_vals, count(b.numbers)
  from ( select level + 94 as all_vals
           from dual
        connect by level <= 11
                ) a
  left outer join tmp_test b
    on a.all_vals = b.numbers
 group by a.all_vals
 order by all_vals
       ;

  ALL_VALS COUNT(B.NUMBERS)
---------- ----------------
        95               10
        96               10
        97               10
        98               10
        99               10
       100                0
       101                0
       102                0
       103                0
       104                0
       105                0

11 rows selected.

但是,如果您想要计算 , 和 if 中列中的值的数量,则letters如下所示:almp

select all_vals, count(b.letters)
  from ( select 'a' as all_vals from dual
          union all
         select 'l' from dual
          union all
         select 'm' from dual
          union all
         select 'p' from dual
                ) a
  left outer join tmp_test b
    on a.all_vals = b.letters
 group by a.all_vals
 order by all_vals
       ;

A COUNT(B.LETTERS)
- ----------------
a               76
l               77
m               77
p                0

如前所述,子查询可以很容易地替换为视图或表格。

LEFT OUTER JOIN 在这里有所不同。您已生成要计算的值列表,然后检查它们是否存在于您感兴趣的列中。

这是一个带有这些示例的有效SQL Fiddle 。

于 2012-11-20T13:40:01.820 回答
2

使用(全局)临时表或嵌套表对象。

  • 临时表(SQLFiddle 演示

    CREATE GLOBAL TEMPORARY TABLE tmp (field NUMBER);
    
    INSERT INTO tmp (...);
    
    SELECT tmp.field, COUNT(t.field)
      FROM table t
     RIGHT JOIN tmp ON t.field = tmp.field
     GROUP BY tmp.field;
    
  • 表对象(演示

    CREATE OR REPLACE TYPE tab AS TABLE OF NUMBER;
    /
    
    SELECT tmp.column_value field, COUNT(t.field)
      FROM table t
     RIGHT JOIN TABLE(tab(a,b,c,d,e)) tmp ON t.field = tmp.column_value
     GROUP BY tmp.column_value;
    
于 2012-11-20T13:43:34.153 回答