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

标签 sql oracle join select exists

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

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集合运算符返回两个集合之间的差异:一个是您期望的所有值,一个是您拥有的所有值。差异就是你所缺少的。

 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>

关于sql - 如何在 ORACLE SQL 中找到不在另一个表中的两列的组合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77589025/

相关文章:

sql - 在 PostgreSQL 中对相似行和计数组进行分组

oracle - Apex 4 错误 : Schema restricted or reserved

mysql - 使用Join时如何选择不同的记录?

c++ - 如何更新这样的 map 结构?

sql - 查找一列中与另一列中的特定行值相关的相同行数

sql - Excel 到 SQL 远程更新到特定用户

sql - Toad:表格自动完成功能不起作用

java - JDBC setMaxRows 数据库使用

SQL如何有效地使用wheresomething!=something?

Mysql函数转换非空值