我有一张表(地址),如下所述:
我想将每个用户的所有数据选为单行。我尝试了左连接,效果很好。例如
select A.Address as permaddress, B.Address as mailaddress from Addresses A left join Addresses B on A.userId = B.userId and B.address_type = 'mail' where A.address_type = 'perm' and A.userId = '987654321'.
当我使用address_type ='camp'将其扩展为2个左连接时,它不起作用。 e.g
select A.Address as permaddress, B.Address as mailaddress, C.Address as campaddress from Addresses A left join Addresses B on A.userId = B.userId and B.address_type = 'mail'
left join Addresses C on A.userId = C.userId and C.address_type = 'camp'
where A.address_type = 'perm' and A.userId = '987654321'.
我不想进行简单的连接,因为如果有人没有其他的address_types,它会删除行。问题是每个人都有address_type ='perm'。 e.g:
select A.Address as permaddress, B.Address as mailaddress from Addresses A, Addresses B where A.userId = B.userId and B.address_type = 'mail' and A.address_type = 'perm' and A.userId = '987654321'.
不确定我是不是应该加入相同的表,或者我应该只使用代码来选择几次。例如
select A.Address as permaddress from from Addresses A where A.address_type = 'perm' and A.userId = '987654321'
然后再做
select B.Address as mailaddress from from Addresses B where B.address_type = 'mail' and B.userId = '987654321'
然后使用代码组合结果
任何帮助将不胜感激。谢谢。
答案 0 :(得分:1)
使用左连接时,无论是否有mailaddress或campaddress值,都会显示所有结果。
select A.Address as permaddress, B.Address as mailaddress, C.Address as campaddress
from Addresses A
left join Addresses B on A.userId = B.userId and B.address_type = 'mail'
left join Addresses C on A.userId = C.userId and C.address_type = 'camp'
where A.address_type = 'perm'
and A.userId = '987654321'
答案 1 :(得分:0)
你可以用PIVOT实现这个目标。
不习惯使用Oracle语法,但这应该可以解决问题.......
SELECT *
FROM (SELECT userid, address_type, address from Addresses)
PIVOT (MAX(address) AS address FOR (address_type) IN ('perm', 'mail', 'camp'));