Sql 从两个表之间的联接中删除重复项(Oracle)

Sql 从两个表之间的联接中删除重复项(Oracle),sql,oracle,Sql,Oracle,我需要连接两个名为MSISDN和RANGES的表。 例如: 我以以下身份加入: select * from MSISDN a left join RANGES b on a.msisdn like b. prefix || '%' and a.network = b.network; 在MSISDN“110211501”的情况下,此查询将为我提供重复项,因为它将与两个前缀匹配。 我需要避免这些重复。我只需要匹配最长前缀(在本例中为“1102”)。 有没有办法加入以

我需要连接两个名为MSISDN和RANGES的表。 例如:

我以以下身份加入:

select * 
from MSISDN a 
  left join RANGES b 
    on  a.msisdn like b. prefix || '%' 
    and a.network = b.network;
在MSISDN“110211501”的情况下,此查询将为我提供重复项,因为它将与两个前缀匹配。 我需要避免这些重复。我只需要匹配最长前缀(在本例中为“1102”)。
有没有办法加入以避免重复或随后执行重复数据消除?

尝试以下查询:

SELECT * FROM ( 
    SELECT 
        n.*, 
        RANK() OVER (PARTITION BY n.MSISDN ORDER BY length(n.prefix) DESC) as rnk
    FROM (
        SELECT * 
        FROM MSISDN a 
        LEFT JOIN RANGES b 
             ON a.msisdn like b. prefix || '%' and a.network = b.network 
        ) n 
    )t
WHERE t.rnk = 1

它应该删除重复项,并为您提供前缀更长的记录。

您真正需要的是更好的数据模型,没有模棱两可的复合值。如果我只想检索MSISDN和网络,而不想检索所有其他列(因为MSISDN和网络是组的一部分),这将起作用。是,您必须将其包装在子查询中,并连接到
范围
select a.* 
     , MAX(LENGTH(b.prefix)) AS prefix_length
from MSISDN a 
  left join RANGES b 
    on  a.msisdn like b. prefix || '%' 
    and a.network = b.network
GROUP BY a.msisdn
       , a.network
select a.* 
     , MAX(LENGTH(b.prefix)) AS prefix_length
from MSISDN a 
  left join RANGES b 
    on  a.msisdn like b. prefix || '%' 
    and a.network = b.network
GROUP BY a.msisdn
       , a.network