【问题标题】:SQL to Compare Data from Two Tables from Separate Databases OracleSQL 比较来自不同数据库的两个表的数据 Oracle
【发布时间】:2021-04-23 22:46:20
【问题描述】:

我有一个带有客户表的加拿大数据库和一个带有客户表的美国数据库。表结构相同。如果美国客户的工作得到处理 在加拿大,那么该客户记录将在 Candian DB 中创建。但是,当客户发生某些变化时,例如他们的地址,用户 只会更新一个数据库而忘记另一个。然后向下有 2 个地址,这会引起混乱。

作为一种审核方式,我正在尝试比较两个表之间的记录,以查看 1) cust_code 是否存在于两者中,如果存在有什么不同。

我正在尝试这个,但不确定这是否是正确的选择。它只给我来自 1 的记录,而不是另一个。但我想比较两者中是否有相同的 cust_code,但例如地址不同。

select *
from 
(
( select cust_code, cust_address, job from cust
  minus 
  select cust_code, cust_address, job from cust@canada)
union all
( select cust_code, cust_address, job from cust@canada
  minus
  select cust_code, cust_address, job from cust)
)

【问题讨论】:

  • 该查询应该为您提供仅存在于其中一个数据库中的客户以及在另一个数据库中不同的客户。我会添加一个指示符,显示哪个数据库提供了记录。如果您仍有问题,请使用一些示例数据创建一个 db fiddle。

标签: sql oracle


【解决方案1】:

我认为你可以使用它。解码功能允许比较甚至空值。

select *
from (
  select 
        us.cust_address "us.cust_address", ca.cust_address "ca.cust_address"
      , decode(us.cust_address, ca.cust_address, 'Match', 'Mismatch') "cust_address.MATCH"
      , us.job "us.job", ca.job "ca.job"
      , decode(us.job, ca.job, 'Match', 'Mismatch') "job.MATCH"
  from cust us
  join cust@canada ca on (us.cust_code = ca.cust_code)
)
where "cust_address.MATCH" = 'Mismatch'
    or "job.MATCH" = 'Mismatch'
;
;

【讨论】:

    【解决方案2】:

    但我想比较两者中是否有相同的 cust_code,但例如地址不同。

    为什么不直接使用join?

    select c.*, cc.*
    from cust c join
         cust@canada cc
         on c.cust_code = cc.cust_code
    where c.job <> cc.job or
          c.address <> cc.address;
    

    【讨论】:

    • 你不觉得少了什么吗?
    • @GerardH.Pille 。 . .将您的评论标记为完全没有成效是非常诱人的。如果您发现问题,您应该明确说明。
    • @GordonLinoff - 我不喜欢选择*,尤其是当两个表具有相同名称的列时。也不需要两次显示cust_code - 因为它应该是相同的(通过连接条件)。而是:select c.cust_code, c.job, cc.job AS ca_job, ... 清楚地并排显示“工作”和“加拿大工作”,地址相同。除此之外,您的联接条件无法处理作业(或地址,或两者)在一个表或另一个(或两者)中为null 的可能性。
    • 加入将排除仅存在于其中一个数据库中的客户代码。我向 OP 提到过,但他似乎不在大楼内。
    • @GerardH.Pille 。 . .这就是OP所要求的。我添加了问题的相关部分以使您清楚。
    【解决方案3】:
    select *
      from 
    (
    ( select 'US' as origin, cust_code, cust_address, job from cust
      minus 
      select 'US' as origin, cust_code, cust_address, job from cust@canada)
    union all
    ( select 'CAN' as origin, cust_code, cust_address, job from cust@canada
      minus
      select 'CAN' as origin, cust_code, cust_address, job from cust)
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-20
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多