【问题标题】:How to convert one table to another table structure and compare data | Oracle如何将一个表转换为另一个表结构并比较数据 |甲骨文
【发布时间】:2021-05-29 05:54:34
【问题描述】:

我有两个结构不同的表,但TableA 的几列与TableB 不同。 在这里,我们必须将TableA 转换为TableB 结构并比较每个数据并标记来自TableB 的缺失行。如果它在TableA 中丢失,我需要忽略这些记录。

我不想使用Union all,并且在执行批量操作时需要考虑查询性能。请以最佳方式提出建议。

表A

NAME GENDER DEPNAME ID1 ID2 ID3 ID4 ID5
Jacob M Math OfficeID PassPort AppID JobID
Maria F Science LabID OfficeID PassPort AppID

表B

NAME GENDER DEPNAME ID
Jacob M Math OfficeID
Jacob M Math PassPort
Jacob M Math AppID
Maria F Science LabID
Maria F Science OfficeID
Maria F Science PassPort

表 A-B

Name Gender DepName ID MissingID
Jacob M Math OfficeID No
Jacob M Math PassPort No
Jacob M Math AppID No
Jacob M Math JobID Yes
Maria F Science LabID No
Maria F Science OfficeID No
Maria F Science PassPort No
Maria F Science AppID Yes

【问题讨论】:

  • 你知道unpivot吗?
  • @Abra,我们如何将 unpivot 仅用于 ID 列?

标签: sql oracle diff


【解决方案1】:

基本上,您想要取消旋转A,然后使用LEFT JOIN 引入来自b 的值:

SELECT a.*,
       (CASE WHEN b.id IS NULL THEN 'Yes' ELSE 'No' END) as is_missing
FROM (SELECT a.name, a.gender, a.depname, i.n, i.id
      FROM TableA a CROSS JOIN LATERAL
           (SELECT 1 as n, id1 as id FROM DUAL UNION ALL
            SELECT 2 as n, id2 FROM DUAL UNION ALL
            SELECT 3 as n, id3 FROM DUAL UNION ALL
            SELECT 4 as n, id4 FROM DUAL UNION ALL
            SELECT 5 as n, id5 FROM DUAL
           ) i
      WHERE id IS NOT NULL
     ) a LEFT JOIN
     tableb b
     ON a.name = b.name AND a.gender = b.gender AND a.depname = b.depname AND a.id = b.id
ORDER BY a.name, a.gender, a.depname, a.n;

我更喜欢横向连接来进行反透视。在 Oracle 11 中,您还可以选择 unpivot。但是,更通用的方法确实使用union all(尽管更快的方法使用union allcross join)。

请注意,不需要聚合。这会按照它们在A 中出现的顺序返回ID。

Here 是一个 dbfiddle。

【讨论】:

    【解决方案2】:

    您可以将条件聚合与非透视行一起用于 TableA 列的所有不同 ID 值,例如

    SELECT a.name AS "Name", a.gender AS "Gender", a.depname AS "Dept Name", a.id, 
           MIN(CASE WHEN a.id != b.id THEN 'Yes' ELSE 'No' END) AS "MissingID"
      FROM
      (
        SELECT DISTINCT *
          FROM TableA a   
       UNPIVOT (id FOR col IN ( id1 AS 'id1',
                                id2 AS 'id2',
                                id3 AS 'id3',
                                id4 AS 'id4',
                                id5 AS 'id5' ))) a
       JOIN TableB b
        ON b.name = a.name
       AND b.gender = a.gender
       AND b.depname = a.depname  
     GROUP BY a.name, a.gender, a.depname, a.id
     ORDER BY a.name, "MissingID"
    
    Name Gender DepName ID MissingID
    Jacob M Math OfficeID No
    Jacob M Math PassPort No
    Jacob M Math AppID No
    Jacob M Math JobID Yes
    Maria F Science PassPort No
    Maria F Science OfficeID No
    Maria F Science LabID No
    Maria F Science AppID Yes

    Demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-05
      • 2019-08-04
      • 2022-06-10
      • 2014-01-27
      • 1970-01-01
      • 2011-04-29
      • 2022-01-18
      • 1970-01-01
      相关资源
      最近更新 更多