Удаление дубликатов из JOIN между двумя таблицами (Oracle) - PullRequest
3 голосов
/ 21 декабря 2011

Мне нужно объединить две таблицы 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 ]

4 голосов
/ 21 декабря 2011

Попробуйте следующий запрос:

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 голосов
/ 21 декабря 2011
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...