2009-03-16 11 views
3

Я написал эту функцию раньше, но я не могу ее запомнить, и она не попала в контроль версий. Теперь, больше, чем лишение сна, чем что-либо еще, я не могу вспомнить, как его перестроить.SQL Outer Join Function

Вот эта идея. У меня есть две таблицы: «regPrice» и «custPrice», с общим ключом «itemID». Они оба имеют столбец «цена», а custPrice также имеет еще один ключ «acct», так что если цена существует в custPrice, она должна вернуть ее. Если нет записи custPrice, она должна вернуть regPrice.

псевдокод:

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

Любая помощь будет оценена.

ответ

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

Выглядит хорошо. Чтобы сделать его хранимой процедурой, это будет просто: CREATE PROCEDURE price (I_itemID INT, I_acct INT) SELECT COALESCE (c.price, r.price) AS цена FROM regPrice r LEFT OUTER JOIN custPrice c ON (r.itemID = c.itemID И c.acct = I_acct) WHERE r.itemID = I_itemID; Это правильно? – Drew

+0

Да, эта процедура работает нормально. –

1

Просмотрите функцию COALESCE, если вы не используете NULL, и в этом случае вы захотите использовать CASE.

+0

Похоже сервер SQL он попросил 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

Есть ли разница в производительности между CASE или COALESCE? – Drew

+0

Нет, не должно быть. –