我有一个包含我所拥有的数据的主表,以及一个告诉我主表应该具有哪些值的参考表。我想检查主表是否包含所有必需的值,如果没有,则返回缺失的值。 我的主表如下所示:
ID ORG DSIT
-----------
1 A AA
1 B BB
2 A AA
2 B BB
2 C CC
我的参考表看起来像:
ORG DSIT
---------
A AA
B BB
C CC
这意味着主表中的每个 ID 应该有 3 列,其中(ORG,DSIT)=(A,AA),(B,BB)和(C,CC)基于参考表。因此,这里 ID 2 没问题,但 ID 1 缺少 ORG 和 DSIT 的 (C,CC) 组合
我尝试过左连接,通过这样做我可以得到 (C,CC) 丢失,但无法判断它属于哪个 ID。我也尝试 NOT EXIST 但它只是不能以这种方式工作。
我期待看到结果:
ID ORG DSIT
-----------
1 C CC
或
ID MESSAGE
-----------
1 'C and CC is missing'
提前致谢;如果我能更好地解释,请告诉我。
这是一种选择。
样本数据:
SQL> with
2 maint (id, org, dsit) as
3 (select 1, 'A', 'AA' from dual union all
4 select 1, 'B', 'BB' from dual union all
5 select 2, 'A', 'AA' from dual union all
6 select 2, 'B', 'BB' from dual union all
7 select 2, 'C', 'CC' from dual
8 ),
9 reft (org, dsit) as
10 (select 'A', 'AA' from dual union all
11 select 'B', 'BB' from dual union all
12 select 'C', 'CC' from dual
13 )
查询从这里开始;它使用
minus
集合运算符返回两个集合之间的 difference:一组是您期望的所有值,一组是您拥有的所有值。差异就是你所缺少的。
14 -- all values you expect
15 select b.id, r.org, r.dsit
16 from (select distinct m.id from maint m) b cross join reft r
17 minus
18 -- all values you have
19 select a.id, a.org, a.dsit
20 from maint a;
ID ORG DSIT
---------- --- ----
1 C CC
SQL>