在连接表中选择包含多行的单行

时间:2017-03-03 08:10:41

标签: mysql database oracle postgresql db2

我有一个联系表如下:

contactid | contactname  
----------|-------------
C1        | Name1  
C2        | Name2

我有一个如下通讯表

contactid | communication_type | communication_string
----------|--------------------|---------------------
C1        | Phone              | 9090909090
C1        | Email              | c1@email.com
C2        | Phone              | 9191919191
C2        | Email              | c1@email.com

现在我的要求是查询这两个表格,结果如下:

contactid | contactname | phonenumber   | emailaddress
----------|-------------|---------------|----------------
C1        | Name1       | 9090909090    | c1@email.com
C2        | Name2       | 9191919191    | c2@email.com

如果我定期加入,请

SELECT cont.contactid, cont.contactname, 
  comm.communication_type, comm.communication_string 
  FROM contact cont
  LEFT JOIN communication comm ON cont.contactid = comm.contactid 

我会得到像

这样的东西
contactid | contactname | communication_type| communication_string 
----------|-------------|-------------------|----------------
C1        | Name1       | Phone             | 9090909090
C1        | Name1       | Email             | c1@email.com
C2        | Name2       | Phone             | 9191919191
C2        | Name2       | Email             | c2@email.com

但这不是我想要的。 我希望结果中的通信字符串位于同一行,而不是不同的行。

这有可能获得这样的结果吗?

还有一个要求是,解决方案应该是通用的,以适用于所有数据库。

2 个答案:

答案 0 :(得分:2)

您可以使用条件聚合:

select cont.contactid,
    cont.contactname,
    max(case when comm.communication_type = 'Phone' then comm.communication_string end) PhoneNumber,
    max(case when comm.communication_type = 'Email' then comm.communication_string end) EmailAddress
from contact cont
left join communication comm on cont.contactid = comm.contactid
group by cont.contactid,
    cont.contactname;

这将返回给定contactId的一个Phonenumber和Emailaddress。

此解决方案适用于大多数RDBMS。

答案 1 :(得分:2)

您可以使用不同的条件多次加入同一个表:

select   c.contactid
    ,c.contactname
    ,cp.comunication_string as 'phonenumber'
    ,ce.comunication_string as 'emailaddress'

from    contact c
        left join
        communication cp    on  c.contactid = cp.contactid
                            and cp.comunication_type = 'Phone'
        left join
        communication ce    on  c.contactid = ce.contactid
                            and ce.comunication_type = 'Email'  

标准SQL,易于阅读。