2016-03-25 28 views
0

我有一個情景,其中有一個聯繫人表(ID,名稱)和電話號碼錶(ID,電話,contactid)。 1個聯繫人可以有很多電話號碼。我想顯示輸出如下:sql加入1到很多 - 避免爲父母重複列

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

基本上我不想重複聯繫人列時,有多個匹配的電話號碼。這可能嗎?

+0

哪個RDBMS是這樣的? mySQL或PostgreSQL?它不可能是兩個;除非你說這個解決方案需要在兩個平臺上工作。 – xQbert

+0

你能解釋爲什麼你不想重複接觸?我想這是可能的在MySQL中,但將需要一些子查詢,這將降低查詢的性能。至於postgresql,我不知道 – piotrgajow

+0

@xQbert postgresql。 – Raj

回答

0

使用窗口功能和內嵌視圖;我們可以做到這一點。

我們生成一組數據,其中每個名稱都有一個爲每個不同名稱分配的row_number,對於每個遇到的新名稱再次從1開始。例如:

|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

它可能不是最好的主意,但它很容易做到:

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;