我当前正在一个数据库中工作,该数据库的表如下所示:
ID | Type | Value
11111 | Type1 | 45
11111 | Type2 | 85
11111 | Type3 | 26
11111 | Type4 | 69
11112 | Type1 | 14
11112 | Type2 | 36
11113 | Type1 | 69
11113 | Type3 | 25
此表的工作方式如下:
每个ID在表中多次出现。 每个ID具有一种或多种类型。 每种类型都有一个值
在上面的示例中,您可以看到ID 11112没有Type3或Type4,并且ID 11113没有Type2或Type4。
此问题是每个ID都应存在某些类型(具有相应的值),为实现此目的,应创建一个列表,其中包含所有缺少这些类型中一个或多个的ID。这样一来,很容易就能看到需要什么ID的类型和附加值。
是否存在可以列出此类列表的查询?给出缺少一个或多个类型的每个实例的唯一ID的代码吗?我只能获取缺少特定类型的ID,但是我无法做到这一点,因此缺少任何类型的ID都会被列出。
答案 0 :(得分:0)
此查询显示至少缺少一种类型的所有ID:
SELECT ID
FROM T
GROUP BY ID
HAVING COUNT(DISTINCT TYPE)<(SELECT COUNT(DISTINCT TYPE) FROM T)
答案 1 :(得分:0)
不是很优雅,但是会返回缺少的ID和类型。我从ID中删除了多余的“ 1111”,从类型中删除了“ ype”(太懒了,无法全部输入)。
SQL> with test (id, type) as
2 (select 1, 't1' from dual union all
3 select 1, 't2' from dual union all
4 select 1, 't3' from dual union all
5 select 1, 't4' from dual union all
6 --
7 select 2, 't1' from dual union all
8 select 2, 't2' from dual union all
9 --
10 select 3, 't1' from dual union all
11 select 3, 't3' from dual
12 ),
13 all_types as
14 (select distinct type from test)
15 --
16 select t.id, a.type
17 from test t join all_types a on 1 = 1
18 minus
19 select t.id, t.type
20 from test t;
ID TY
---------- --
2 t3
2 t4
3 t2
3 t4
SQL>
答案 2 :(得分:0)
您可以生成所有必需的类型和ID组合,然后过滤掉现有的类型和ID:
with required_types as (
select 'type3' as type from dual union all
select 'type4' as type from dual
)
select i.id, rt.type
from (select distinct id from t) i cross join
required_types rt left join
t
on t.id = i.id and t.type = rt.type
where t.id is null;
如果数据中存在的所有类型都是必需的,则可以使用{{1} }。