[英]Join tables without dropping rows
我有一個表(地址),如下所述:
我想為每個用戶選擇所有數據作為一行。 我嘗試了左連接,效果很好。 例如
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'.
當我將其擴展到2個具有address_type ='camp'的左連接時,它不起作用。 例如
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'。 例如:
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'
然后使用代碼合並結果
任何幫助將不勝感激。 謝謝。
使用左聯接時,將顯示所有結果,無論它們是否具有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'
您可以使用PIVOT實現此目的。
不習慣Oracle語法,但這應該可以解決問題。
SELECT *
FROM (SELECT userid, address_type, address from Addresses)
PIVOT (MAX(address) AS address FOR (address_type) IN ('perm', 'mail', 'camp'));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.