oracle 连接A B两张表对比,对比2个字段,但是2个字段是一对多关系,怎么比?

作者站长头像
站长
· 阅读数 15

oracle 连接A B两张表对比,对比2个字段-字段1 、字段2(A B表都有)。

但是字段1和字段2是1对多关系(字段1对应多个字段2).

想要输出:如果A、B两个表的字段1或者2不同,输出异常原因:字段1不同/字段2不同。

由于字段1和字段2是一对多,在case when 比的时候 会出现:

字段1和字段2:A 表: 比 B表

  字段1:A 字段2:B                  字段1:A    字段2:C
  字段1:A 字段2: C                  字段1:A    字段2:D
  字段1:A 字段2: D                  字段1:A    字段2:B
  字段1:A 字段2: F

这样其实 A表和B表有3行记录一样,但是因为排序问题导致 结果对比都显示3行数据不一致(其实因该是A表比B表多一个AF,想要显示1行数据不一致,其他3行数据一致),这个咋解决。

回复
1个回答
avatar
test
2024-07-17

没用过 oracle,用个 SQLite 吧,它的语法类似,功能 oracle 应该都支持

结果

result
共 5 行,2 行不一致

SQLite 代码

WITH
  A(字段1, 字段2) AS (
    VALUES
      ('A', 'B'),
      ('A', 'C'),
      ('A', 'D'),
      ('A', 'F')
  ),
  
  B(字段1, 字段2) AS (
    VALUES
      ('A', 'C'),
      ('A', 'D'),
      ('A', 'B'),
      ('A', 'E')
  )

SELECT format('共 %d 行,%d 行不一致', COUNT(*), SUM(A.字段1 IS NULL OR B.字段1 IS NULL)) result
  FROM A
  FULL JOIN B ON (A.字段1, A.字段2) = (B.字段1, B.字段2);
回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容