连接表而不删除行

时间:2014-07-18 14:43:35

标签: sql oracle join

我有一张表(地址),如下所述:

enter image description here

我想将每个用户的所有数据选为单行。我尝试了左连接,效果很好。例如

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'

然后使用代码组合结果

任何帮助将不胜感激。谢谢。

2 个答案:

答案 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'));

Oracle Pivot