我有一个联系表如下:
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
但这不是我想要的。 我希望结果中的通信字符串位于同一行,而不是不同的行。
这有可能获得这样的结果吗?
还有一个要求是,解决方案应该是通用的,以适用于所有数据库。
答案 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,易于阅读。