查找一个表中存在的记录,但找不到没有主键

时间:2016-12-12 17:19:03

标签: sql oracle

我正在考虑更改使用外部工具完成的数据加载,以使用该工具基于多个连接生成平面文件,然后使用SQL * Loader加载到表中。

我想不再使用这个程序并使用外部表,而是将表插入移动到数据库中。我不确定我的联接的有效性与程序正在做的事情有关。当我比较使用外部表格所做的事情时,我有14702052条记录和14268891条不同的记录。当我用加载了旧工具的表与相同数据进行比较时,我有14669198条记录,与14268888不同。我并不担心总数,因为重复项是可以的,它正在更新一些值,重复应该不重要。

我似乎无法弄清楚什么是额外的不同值。我已经尝试过减去,不是,不存在,加入,也许是其他一些尝试我不记得我的头脑,但我没有记录。表中没有主键可以加入,这使得检查很难。

如果记录较少,我可以使用Kdiff3进行比较,但是因为它的输出太大而无法在我的计算机上运行。我可能试图通过rownum将其分解为最坏的情况,试图找到额外的记录。

任何人对替代方案有任何建议吗?

编辑: 这是表结构,不得不删除一些名称

CREATE TABLE T ( 
ID varchar2(11 byte), 
CLASS_CD varchar2(4 byte), 
ITEM_NAME varchar2(60 byte), 
UNIT_OF_ISSUE varchar2(2 byte), 
PRICE number(15,2), 
ITEM_CD varchar2(3 byte), 
SERVICE_CD varchar2(2 byte)); 

这是一个示例记录,虽然我已经替换了大部分灵敏度值。

ID         CLASS_CD ITEM_NAME      UOI     PRICE   ITEM_CD   SERVICE_CD
000000057  1111     NAME       FT      5.91    NULL      BC

1 个答案:

答案 0 :(得分:3)

假设您在同一结构中同时拥有新旧表,这应该至少为您提供3条记录

select * from new_table
minus 
select * from old_table

无论如何,请使用此查询来查找差异

select      count(case when tab='O' then 1 end) as cnt_old
           ,count(case when tab='N' then 1 end) as cnt_new

           ,id,class_cd,item_name,uoi,price,item_cd,service_cd

from        (           select 'O' as tab,t.* from old_table t
            union all   select 'N'       ,t.* from new_table t
            ) t

group by    id,class_cd,item_name,uoi,price,item_cd,service_cd   

having      count(case when tab='O' then 1 end) = 0
        or  count(case when tab='N' then 1 end) = 0
;