2016-04-06 14 views
0

I Tabelle haben, die die IDs wie enthält -wie Zeilen auszuwählen, basierend auf Bedingung sql

id 
o1 
o2 
o3 

jetzt eine andere Tabelle enthält Preis für diese auf dem Land, ids wie

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

im Grunde ich habe um eine gespeicherte Prozedur zu schreiben, in der ich die Region als Parameter übergebe. Zum Beispiel, wenn die Region UK ist, dann möchte ich die Zeilen wie folgt auswählen, wenn es eine Übereinstimmung gibt, dann wähle die Zeile ansonsten Standardzeile.

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

Können Sie bitte eine gute und effiziente Art des Schreibens in SQL vorschlagen?

Antwort

1

Verwenden CROSS APPLY mit TOP:

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

Ein Verfahren verwendet zwei 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'; 

Ich denke, eine interessantere Methode verwendet 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; 
Verwandte Themen