2016-03-25 29 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;