从两个表的连接中删除重复项(Oracle)

3

我需要连接两个名为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')。 有没有办法在连接时避免重复或之后进行去重?


1
你真正需要的是一个更好的数据模型,没有含糊不清的复合值。 - Tony Andrews
2个回答

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

它应该删除重复项并提供具有更长前缀的记录。


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

这将适用于仅检索MSISDN和NETWORK,而不是所有其他列(因为按MSISDN和NETWORK分组)。 - user645438
是的,您需要将其包装在子查询中并加入到“Ranges”中。 - ypercubeᵀᴹ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接