比较同一张表oracle中的数据

Posted

技术标签:

【中文标题】比较同一张表oracle中的数据【英文标题】:Compare data in same table oracle 【发布时间】:2021-01-28 16:39:00 【问题描述】:

我需要比较同一张表中两个不同 id 的数据。

例如)Id 123 可以包含项目 a、b、c ID 234 可以有项目 x,a,b 并且 id 789 可以有项目 a,b,c。

我的 sql 应该可以根据 items 列说 Id 123 和 Id 789 相同,或者根据 item 列说 Id 123 或 id 234 不同。

我想我们可以在 oracle 中使用 self join 来做到这一点,但我不确定如何。

修正—— 项目 a、b 和 c 位于 Id 123 或 Id 789 的 3 个不同记录中。

【问题讨论】:

什么是项目 - 单列,其中值是一个字符串,显示以逗号分隔的项目?如果是这样,似乎这些项目没有任何特定的顺序。顺序是否重要,或者'a,b,c' 是否与'c,a,b' 相同?无论如何,设计数据模型的人都应该被解雇;第一范式在第一个月的任何数据库介绍课程中教授。 当我说项目 a、b、c 时,我的意思是它们是相同 ID 123 的三个不同记录。它实际上不是一个字符串。希望我已经清除了它。 【参考方案1】:

您可以使用 cte 并将每条记录与所有其他记录连接起来进行比较,如下所示:

With cte as
(Select id, listagg(item,',') within group (order by item) as items
   From your_table t
  Group by id)
Select t1.id, t2.id,
       Case when t1.items = t2.items then 'match' else 'do not match' end as res_
 From cte t1 join cte t2 on t1.id < t2.id 

【讨论】:

当我们将列值与 listagg 组合时,是否有任何大小/长度限制?【参考方案2】:
ID t1 t2 t3
1 a b c
2 b c a
3 c b a
4 a c b
5 a b c
select t1.*
  from table t1
  join table t2
    on t1.id != t2.id 
   and t1.t1 = t2.t1
   and t1.t2 = t2.t2
   and t1.t3 = t2.t3

数据输出

ID t1 t2 t3
1 a b c
5 a b c

重要的是表连接自身并且ID不同,以免评估相同的记录。

【讨论】:

【参考方案3】:

设置

create table T1 (id number(10), x nvarchar2(10), y nvarchar2(10));
insert into T1 values(1, 'aaa', 'bbb');
insert into T1 values(2, 'xxx', 'xxx');
insert into T1 values(3, 'aaa', 'bbb');
insert into T1 values(4, 'ccc', 'ccc');

打电话

select a.id aid, b.id bid, 'same' status  -- all items with matching fields
from 
  (select 'fakeId123' fakeId, t.* from T1 t where id = 1) a inner join 
  (select 'fakeId123' fakeId, t.* from T1 t where id = 3) b on a.fakeId = b.fakeId
where a.x = b.x and a.y = b.y 
union all
select a.id, b.id, 'different' status -- union with all items with not matching fields
from 
  (select 'fakeId123' fakeId, t.* from T1 t where id = 2) a inner join 
  (select 'fakeId123' fakeId, t.* from T1 t where id = 4) b on a.fakeId = b.fakeId
where a.x <> b.x and a.y <> b.y 

结果

AID BID STATUS
1 3 same
2 4 different

【讨论】:

以上是关于比较同一张表oracle中的数据的主要内容,如果未能解决你的问题,请参考以下文章

同一张表中的行之间的差异(Oracle SQL)

如何用通配符比较同一张表中的两条记录?

同一张表中的 SQL DATE 比较

在Oracle-sql中比较两张表并更新一张表

oracle如何比较两个表数据的差异?

如何比较来自不同列和不同行但同一张表的值?