2016-04-06 158 views
0

我有表包含了像的ID -如何根據條件SQL選擇行

id 
o1 
o2 
o3 

現在另一個表包含價格爲立足之本,這些ID喜歡

id country  price 
o1 IND   11 
o1 US   10 
o1 default  9 
o2 default  2 
o3 UK   4 
o3 default  3 

基本上我有編寫一個存儲過程,我將通過該區域作爲參數。例如如果地區是英國,那麼我想要選擇行如下,如果匹配,然後選擇行,否則默認行。

id  country  price 
o1  default  9 
o2  default  2 
o3  UK    4 

請問您能否提出一種在SQL中編寫的有效且高效的方法?

回答

1

使用CROSS APPLYTOP

DECLARE @country VARCHAR(20) = 'UK' 

SELECT x.* 
FROM tblId i 
CROSS APPLY(
    SELECT TOP 1 * 
    FROM tblPrice p 
    WHERE 
     p.id = i.id 
     AND (p.country = @country OR p.country = 'default') 
    ORDER BY 
     CASE 
      WHEN p.country = 'default' THEN 1 
      ELSE 0 
     END 
)x 
0

一種方法使用兩個left join S:

select ids.id, coalesce(p.country, d.country) as country, 
     coalesce(p.price, d.price) as price 
from ids left join 
    prices p 
    on ids.id = p.id and p.country = @country left join 
    prices d 
    on d.country = 'default'; 

我覺得更有趣的方法使用cross apply

select p.* 
from ids cross apply 
    (select top 1 p.* 
     from prices p 
     where p.id = ids.id and p.country in (@country, 'default') 
     order by (case when p.country = @country then 1 else 2 end) 
    ) p;