Oracle SQL比较表中的记录

时间:2016-08-02 15:58:15

标签: sql oracle inner-join

我有一张如下表:

S.No | Item_ID | Item_Revision | Code |
-----+---------+---------------+-------
1.   | item1   | 0             | xyz  |
2.   | item2   | 0             | xyz  |
3.   | item3   | 0             | xyz  |
4.   | item1   | 1             |      |
5.   | item2   | 1             | abc  |
6.   | item3   | 1             | xyz  |

我需要比较表中的记录,以找出不同修订版本中代码的差异。

我想要的结果如下:

 | Item_ID | Code_Revision_0 | Code_Revision_1 |
 | item1   | xyz             |                 |
 | item2   | xyz             | abc             |

我无法为此目的制定oracle查询。

提前致谢!

3 个答案:

答案 0 :(得分:1)

您可以使用自联接来执行此操作。

select t1.item_id, t1.code code_rev_0, t2.code code_rev_1
from tablename t1
join tablename t2 on t1.item_id=t2.item_id 
and t1.item_revision = 0 and t2.item_revision = 1
where nvl(t1.code,'a') <> nvl(t2.code,'a')

答案 1 :(得分:1)

一个基本想法是使用join

select t0.item_id, t0.code as code_0, t1.code as code_1
from t t0 join
     t t1
     on t0.item_id = t1.item_id and
        t0.item_revision = 0 and
        t1.item_revision = 1
where t0.code <> t1.code;

但是,如果code值为NULL(或空字符串),则需要更加小心:

where t0.code <> t1.code or (t0.code is null and t1.code is not null) or
      (t0.code is not null and t1.code is null) 

答案 2 :(得分:1)

这是一个使用PIVOT运算符而不是自联接的解决方案。如果我正确地阅读执行计划,那么对于您提供的输入数据,这会更有效(成本为13,对于连接解决方​​案为17)。您可能希望在实际数据上测试两个解决方案,以确定哪个更好。

with
     input_data ( item_id, item_revision, code ) as (
       select 'item1', 0, 'xyz' from dual union all
       select 'item2', 0, 'xyz' from dual union all
       select 'item3', 0, 'xyz' from dual union all
       select 'item1', 1, ''    from dual union all
       select 'item2', 1, 'abc' from dual union all
       select 'item3', 1, 'xyz' from dual
     )
select *
from input_data
pivot (max(code) for item_revision in (0 as code_revision_0, 1 as code_revision_1))
where code_revision_0              != code_revision_1 
   or code_revision_0 is     null and code_revision_1 is not null
   or code_revision_0 is not null and code_revision_1 is     null
;

<强>输出

ITEM_ CODE_REVISION_0  CODE_REVISION_1
----- ---------------- ----------------
item1 xyz
item2 xyz              abc

2 rows selected.