You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写Oracle Apex IG查询对比跨库同结构员工表

问题描述

需要编写Oracle APEX交互式网格(IG)的查询,对比两个结构相同但位于不同数据库的employees表:

  • 本地库查询:
select emp_id,emp_name,emp_grade,emp_org,emp_unit from employees;
  • 目标库查询:
select emp_id,emp_name,emp_grade,emp_org,emp_unit from employees@dest_db;

需求是展示两类数据:

  1. 目标库中与本地库存在字段差异的行
  2. 目标库有但本地库完全没有的行

我尝试用CASE语句编写了如下查询,但只能返回存在差异的行,无法获取目标库独有的行:

select emp_id,emp_name,emp_grade,emp_org,emp_unit,
case when a.emp_id=b.emp_id then 1 else 0 end empid_match ,
case when a.emp_name=b.emp_name then 1 else 0 end emp_name_match ,
case when a.emp_grade=b.emp_grade then 1 else 0 end emp_grade_match ,
case when a.emp_org=b.emp_org then 1 else 0 end emporg_match ,
case when a.emp_unit=b.emp_unit then 1 else 0 end emp_unit_match ,
 from employees@dest_db a, employees b 
where a.emp_id = b.emp_id and b.database='DEST_DB';
解决方案

要拿到目标库独有的行,把原来的等值连接换成LEFT JOIN就行——左连接会保留左表(也就是目标库的employees@dest_db)的所有行,哪怕右表(本地库employees)没对应emp_id的记录。另外你原来的查询里有个明显的问题:b.database='DEST_DB'这个条件大概率是笔误,本地库的employees表应该不会有database字段,直接删掉就行。

修改后的查询如下,还加了个row_type字段方便你在IG里一眼区分行的类型:

select 
    a.emp_id,
    a.emp_name,
    a.emp_grade,
    a.emp_org,
    a.emp_unit,
    -- 标记是否有本地匹配的emp_id
    case when b.emp_id is not null then 1 else 0 end empid_match,
    -- 逐个字段对比,无匹配时返回0
    case when a.emp_name = b.emp_name then 1 else 0 end emp_name_match,
    case when a.emp_grade = b.emp_grade then 1 else 0 end emp_grade_match,
    case when a.emp_org = b.emp_org then 1 else 0 end emporg_match,
    case when a.emp_unit = b.emp_unit then 1 else 0 end emp_unit_match,
    -- 直观标记行的类型
    case 
        when b.emp_id is null then '目标库独有'
        when (a.emp_name != b.emp_name or a.emp_grade != b.emp_grade or a.emp_org != b.emp_org or a.emp_unit != b.emp_unit) then '与本地存在差异'
        else '与本地完全一致'
    end row_type
from employees@dest_db a
left join employees b 
    on a.emp_id = b.emp_id
-- 只保留你需要的两类行:目标库独有、存在差异
where b.emp_id is null 
   or (a.emp_name != b.emp_name or a.emp_grade != b.emp_grade or a.emp_org != b.emp_org or a.emp_unit != b.emp_unit);

关键点解释:

  • LEFT JOIN:核心就是这个,确保目标库的所有行都能被查到,不管本地有没有对应记录
  • WHERE过滤:把和本地完全一致的行排除掉,只留你要的两类数据
  • row_type字段:在APEX IG里可以给这个字段设置不同的颜色,比如把“目标库独有”标成蓝色,“存在差异”标成红色,一眼就能看出来
  • NULL处理:当本地没匹配时,b表的字段都是NULL,这时候CASE语句会返回0,标记为不匹配

内容的提问来源于stack exchange,提问作者Velocity

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 20:20:28