概述
INTRO:下面我将展示如何做到"手工"这些工具(例如SQL Developer)可以做得更快更好。我对此(和你的!)的兴趣是双重的:学习和使用一些可以帮助解决许多其他问题的想法;并首先了解这些工具的内幕。
行。假设你有两个表,它们有许多共同的列(可能不是以相同的顺序),而且几列可能不同 - 一个表中可能有少量列,但另一个表中可能没有。首先,您希望能够只查看公共列。
然后,假设已经完成了。现在这两个表的左边有多个共同的行,但有一些是不同的。行可以存在于一个表中但不存在于另一个表中,或者两行(每个表中有一行)可能非常相似,但它们可能仅在一个或少量列值中不同。逻辑上,这些仍然是第一个表中的一行而不是第二行,而另一行仅在第二个表中但不在第一个表中。但是,假设两个表都具有相同的PK列 - 那么两个表中的PK值可能相同,但至少有一个OTHER列在两个表中具有不同的PK值。并且,您希望在两个表之间找到这些差异。
在下文中,我将假设如果两个表中的两列具有相同的名称,它们也将具有相同的数据类型。如果在您的情况下无法保证,可以在我识别"常用列"的部分中进行更多工作来修复它。 - 而不是仅仅通过名称匹配它们,从目录视图中,它们也必须与数据类型匹配。
当您在最后一步中比较两个表中的行时,(A minus B) union all (B minus A)有效,但效率不高。每个表都被读取两次,minus是一个昂贵的运算符。几年前,我在AskTom的长篇大论中讨论了更有效的解决方案,我将在下面进行说明。即:收集两个表中的所有行(使用union all),按所有列分组,并忽略计数为2的组。这意味着在两个表中找到的行,因此它们是重复的union all!实际上,你会看到一个额外的小技巧,以确定从哪个表中"非重复"行来了。为" table_name"添加一列在最终选择中,在使用count(*) = 1对组进行分组和保留后,选择max(table_name)。您需要一个聚合函数(如max()),因为您正在进行分组,但对于这些行,每个组只有一行,因此max()实际上只是表名。
这种方法的优点在于它也可用于识别常见的列!在这种情况下,我们将比较USER_TAB_COLS视图中的行 - 我们选择出现在任一表中的列名,并仅保留重复的列名(因此列名出现在两个表中)。在解决方案的该部分中,我还检索column_id,用于对列进行排序。如果你不熟悉keep (dense_rank first..
最后
以上就是虚幻星星为你收集整理的oracle 两表两列数据对比_当表中的列数不同时,如何比较oracle中的两个表的全部内容,希望文章能够帮你解决oracle 两表两列数据对比_当表中的列数不同时,如何比较oracle中的两个表所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复