如何在多个列上的oracle行之间查找重复项?

时间:2018-08-09 06:48:32

标签: oracle oracle11g oracle-sqldeveloper

我在oracle中有两个表。我需要在多个列上找到重复项。它不应将空值视为其中任何一个重复。我想要实现的结果是在一行中找到一个结果,这样我就将第一个用户作为ExistingUser asn的每条与之匹配的记录都按Name,Phone或Adressing作为MatchingUsers列进行匹配。

我有一个NAME = MAX ZANEO的用户,他的Phone = 123和ADDRESS = SesameStreet。然后按ID排序,表中又有两个用户,NAME = NODD A,电话= 123,ADDRESS =华尔街。 NAME = NODD B,他的Phone = 345,ADDRESS = SesameStreet。然后,我想要以如下方式提供数据的方式(粗体为列标题,斜体为列数据): ExistingUser = MAX ZANEO MatchingUsers = NODD A,NODD B MatchingData = 电话,地址

下面是对数据源的查询。

  select
   up.ID
   , ( up.FirstName || ' ' || up.LastName ) as FullName
   , up.Phone
   , up.Email
   , uph.Address
   From
   UserProfile up
   Left Join
   UserProfileHistory uph
  on up.ID =  uph.UserProfileId
   Order by up.Created

Image of Result data of the query above

1 个答案:

答案 0 :(得分:1)

由于ID和电话号码在数据中是唯一的,因此请使用自我联接,然后可以将它们的总和用作唯一值。两者总和完全相同的行将相似且重复。

 a.Id + b.Id + TO_NUMBER(regexp_replace(a.Phone, '[^[:digit:]]', '')) + TO_NUMBER(regexp_replace(b.Phone, '[^[:digit:]]', '')) as UniqueSum

然后在临时表中使用此结果,并像这样计算行号

row_number() over(partition by  UniqueSum order by Created ) as RowNumber

然后选择最上面的行,例如:

 where RowNumber = 1