2011-12-21 14 views
3

MSISDNとRANGESという2つのテーブルを結合する必要があります。 例:2つのテーブル間でJOINから重複を削除する(Oracle)

MSISDN table: 

MSISDN   NETWORK 
110011500 D000 
110211501 D000 

RANGES table: 

PREFIX NETWORK DESCRIPTION 
11 D000 NEOTEL 
1102 D000 TELKOM 

私はとして参加しています:このクエリは、それは両方のプレフィックスと一致するので、私は、MSISDN「110211501」のように、ケースに複製与える

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

。 私はこれらの重複を避ける必要があります。私は最も長い接頭辞(この場合は '1102')とのみ一致する必要があります。 重複を回避する方法や重複を後で行う方法はありますか?

+1

本当に必要なのは、あいまいな化合物の値がない、より良いデータモデルです。 –

答えて

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 

それは重複を削除し、長いプレフィックスであなたのレコードを与える必要があります。

+2

これは本当に私の問題を解決しました。ありがとう –

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 
+0

MSISDNとNETWORKのみを取得したい場合は、他のすべての列(MSISDNとNETWORKでグループのbeacuse)を取得したい場合は、これが動作します。 –

+0

はい、これをサブクエリで囲み、 'Ranges'に参加させる必要があります。 –

関連する問題