我有一个条目列表,如果它们位于表的列中,我需要知道它。这很容易,但我不知道如何在DB列中没有出现此列表的条目时进行标记。 如果可能知道每个元素的Db列中的结果计数。如果列表中的元素未出现在DB列中,则输出必须为0.
当我说出一个列表时,它就是:
select xxxxxx from TABLE WHERE field in (a, b, c, d, ... , z);
答案 0 :(得分: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.
但是,如果您想要计算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就是这里的不同之处。您已生成要生成的值的生成列表,然后检查它们是否存在于您感兴趣的列中。
答案 1 :(得分:2)
使用(全局)临时表或嵌套表对象。
临时表(SQLFiddle demo)
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;
表对象(demo)
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;