我有一个条目列表,我需要知道它们是否在表格的列中。这很容易,但我不知道如何标记此列表的条目何时未出现在 DB 列中。如果可能知道每个元素的 Db 列中的结果计数。当列表的元素未出现在 DB 列中时,输出必须为 0。
当我说一个列表时,它是:
select xxxxxx from TABLE WHERE field in (a, b, c, d, ... , z);
为了做到这一点,您首先需要一种方法来了解要计算的值列表是什么。您必须以某种方式自己生成它并将它们存储在某些描述的子查询中,或者使用此信息创建表或视图。
然后,您可以加入您的主表并计算出数字。
以下表为例:
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
如下所示:a
l
m
p
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 在这里有所不同。您已生成要计算的值列表,然后检查它们是否存在于您感兴趣的列中。
使用(全局)临时表或嵌套表对象。
临时表(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;