如何在ORACLE SQL中找到不在另一个表中的两列的组合?

问题描述 投票:0回答:1

我有一个包含我所拥有的数据的主表,以及一个告诉我主表应该具有哪些值的参考表。我想检查主表是否包含所有必需的值,如果没有,则返回缺失的值。 我的主表如下所示:

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 oracle join select exists
1个回答
0
投票

这是一种选择。

样本数据:

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>
© www.soinside.com 2019 - 2024. All rights reserved.