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

时间:2011-12-21 13:26:35

标签: sql oracle

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

MSISDN table:

MSISDN          NETWORK
110011500   D000
110211501   D000

RANGES table:

PREFIX  NETWORK DESCRIPTION
11  D000    NEOTEL
1102    D000    TELKOM

我加入为:

select * 
from MSISDN a 
  left join RANGES b 
    on  a.msisdn like b. prefix || '%' 
    and a.network = b.network;

此查询将为MSISDN'110211501'提供重复,因为它将与两个前缀匹配。 我需要避免这些重复。我只需要匹配最长的前缀(在这种情况下为'1102')。 有没有办法如何加入避免重复或后来进行重复?

2 个答案:

答案 0 :(得分:4)

尝试以下查询:

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

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

答案 1 :(得分:0)

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
相关问题