2009-03-16 5 views
3

J'ai écrit cette fonction auparavant mais je n'arrive pas à m'en souvenir et elle n'est pas passée en contrôle de version. Maintenant, plus à faire avec la privation de sommeil que toute autre chose, je ne peux pas me rappeler comment le reconstruire.Fonction de jointure externe SQL

Voici l'idée. J'ai deux tables, "regPrice" et "custPrice", avec la clé partagée "itemID". Ils ont tous deux une colonne "prix" et custPrice a aussi une autre clé "acct" telle que si un prix existe dans custPrice, il devrait retourner celui-là. S'il n'y a pas d'entrée custPrice, elle doit renvoyer le regPrice.

pseudocode:

if(select custPrice where acct = passedAcct and itemID = passedItemID) { 
    return custPrice; 
else 
    return regPrice; 

Toute aide serait appréciée.

Répondre

6
SELECT COALESCE(c.price, r.price) AS price 
FROM regPrice r LEFT OUTER JOIN custPrice c 
ON (r.itemID = c.itemID AND c.acct = ?) 
WHERE r.itemID = ?; 
+0

semble bon. Pour en faire une procédure stockée, il suffirait de: CREATE PROCEDURE tarification (I_itemID INT, I_acct INT) CHOISIR COALESCE (prix, prix) AS prix FROM regPrice r LEFT OUTER JOIN custPrice c ON (r.itemID = c.itemID AND c.acct = I_acct) O r r.itemID = I_itemID; Est-ce correct? – Drew

+0

Oui, cette procédure fonctionne bien. –

1

Examinez la fonction COALESCE, sauf si vous n'utilisez pas la valeur NULL, auquel cas vous voudrez utiliser un CASE.

+0

Sons comme sql server- il a demandé mysql –

2
select r.itemID, r.Acct, 
case when c.price is null then r.price else c.price end as price 
from regPrice r 
left outer join custPrice c 
on r.itemID = c.itemID 
and r.Acct = @passedAcct 
where r.itemID = @passedItemID 
+0

Existe-t-il une différence de performance entre un CASE ou un COALESCE? – Drew

+0

Non, il ne devrait pas y avoir. –