2014-02-07 72 views
0

兩個表:人員和地址;連接條件是addresses.key_value = person.person_id。sql查詢獲取一個人的多個地址的一個地址

有三個addresses.address_type:'R','M','T'。

取person.first_name,addresses.address_1,addresses.zip,addresses.state

如果address_type 'T' 然後取 'T' 否則,如果 'M' 其他 'R' 的地址。

對於每個地址,地址表中都有唯一的address_id。

+0

你使用什麼數據庫? –

回答

0

您正在尋找地址的優先級。大多數數據庫支持窗口/分析功能,並提供一個機制:

select p.first_name, a.address_1, a.zip, a.state 
from person p join 
    (select a.*, 
      row_number() over (partition by a.person_id 
           order by (case when a.address_type = 'T' then 1 
               when a.address_type = 'M' then 2 
               when a.address_type = 'R' then 3 
              end) 
           ) as seqnum 
     from addresses a 
    ) a 
    on p.person_id = a.person_id and seqnum = 1; 

編輯:

如果你想要一個給定類型的所有地址,只需切換row_number()dense_rank()

select p.first_name, a.address_1, a.zip, a.state 
from person p join 
    (select a.*, 
      dense_rank() over (partition by a.person_id 
           order by (case when a.address_type = 'T' then 1 
               when a.address_type = 'M' then 2 
               when a.address_type = 'R' then 3 
              end) 
           ) as seqnum 
     from addresses a 
    ) a 
    on p.person_id = a.person_id and seqnum = 1; 
+0

如果所有三種地址類型的地址都存在,那麼對於一個人......需要獲取地址類型'T'的地址。如果T不在那裏,M和R就在那裏,那麼M必須被提取。如果T和M不在那裏,那麼R的地址應該被佔用。 – user2886453

+0

@ user2886453。 。 。這就是代碼所做的。 –

+0

謝謝gordon ..它幫助 – user2886453

0

如果使用的是SQLSERVER 2005+,這可能是您的解決方案:

select * from person p 
--cross apply instead of outer apply if you only want people with addresses 
outer apply 
(select top 1 with ties * from addresses where p.person_id = key_value 
order by case address_type when 'T' then 1 when 'M' THEN 2 WHEN 'R' THEN 3 END 
) a 
+0

如果所有三種地址類型的地址都存在,那麼對於一個人......需要獲取地址類型'T'的地址。如果T不在那裏,M和R就在那裏,那麼M必須被提取。如果T和M不在那裏,那麼R的地址應該被佔用。 – user2886453

+0

@ user2886453是不是我的查詢完全是什麼? –