如何将一个表转换为另一个表结构并比较数据|Oracle



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

我不想使用Union all,因为我正在执行批量操作,所以需要考虑查询性能。请用最好的方法提出建议。

表格A

<1th>ID2<2th>ID3ID4<5th>ID5数学护照应用程序ID科学实验室ID办公ID>应用程序ID
NAME GENDER DEPNAME ID1
Jacob M办公ID
Maria FPassPort

基本上,您希望取消预览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中,您还可以选择取消透视。然而,更通用的方法确实使用union all(尽管更快的方法使用union allcross join(。

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

这里有一个db<gt;不停摆弄

对于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"
部门姓名身份密码端口否作业ID是科学办公ID否科学应用程序ID是
姓名性别任务身份
Jacob
JacobM数学
Jacob
JacobM数学
MariaF护照
MariaF科学
Maria
MariaF

相关内容

最新更新