2016-03-25 21 views
0

için sütunları yinelemekten kaçının Bir iletişim tablosunun (id, name) ve telefon numaraları tablosunun (id, telefon, contactid) olduğu bir senaryo var. 1 kişi çok sayıda telefon numarasına sahip olabilir. Ben şöyle çıkışını göstermek istiyorum:sql 1'e çok katılın - ana

|Contact | Phone | 
|----------|---------| 
|contact 1 | phone 1 | 
|   | phone 2 | 
|   | phone 3 | 
|contact 2 | phone 4 | 
|contact 3 | phone 5 | 
|   | phone 6 | 
|   | phone 7 | 

Temelde birden çok eşleme telefon numarası yokken kontak sütununu tekrarlamak istemiyoruz. Mümkün mü?

+0

Bu RDBMS nedir? mySQL veya PostgreSQL? İkisi de olamaz; Çözümün her iki platformda da çalışması gerektiğini söylemezseniz. – xQbert

+0

Tekrarlanan kişileri neden istemediğimi açıklar mısınız? Sanırım MySQL'de mümkündür, ancak sorgunun performansını azaltacak bazı alt sorgular gerektirir. Postgresql gelince ben emin değilim – piotrgajow

+0

@ xQbert postgresql. – Raj

cevap

0

pencere fonksiyonları ve bir satır içi görünümünü kullanarak; Bunu başarabiliriz.

Her adın karşılaşılan her yeni ad için tekrar 1'den başlayarak her bir ad için kendisine atanmış bir row_number'i olduğu bir veri kümesi oluşturuyoruz. Örneğin:

|Contact | Phone | RN 
|----------|---------| 
|contact 1 | phone 1 | 1 
|   | phone 2 | 2 
|   | phone 3 | 3 
|contact 2 | phone 4 | 1 
|contact 3 | phone 5 | 1 
|   | phone 6 | 2 
|   | phone 7 | 3 

SELECT Case when RN= 1 then C.Name end as Contact, Phone 
FROM 
    (SELECT C.Name, P.Phone, row_number() over (partition by C.Contact order by P.Phone) RN 
    FROM contact C 
    INNER JOIN phoneNumbers P 
    ) As InLineVIew 
1

Bu iyi bir fikir olmayabilir ama bunu yapmak oldukça kolaydır:

SELECT 
    CASE WHEN row_number = 1 THEN contact ELSE NULL END AS contact 
    ,phone 
FROM 
(
    SELECT 
    row_number() OVER(PARTITION BY contact) 
    ,contact 
    ,phone 
    FROM foo 
) q 
ORDER BY contact, row_number, phone; 
İlgili konular