Первое, что я заметил, это то, что у вас есть условие предиката в таблице e, которая находится на "внешней" стороне внешнего соединения. Это немедленно превратит объединение во внутреннее объединение, так как строки, которые обычно создаются, где есть запись на внутренней стороне, но нет записи на внешней стороне, будут иметь все нули в столбцах внешней таблицы время выполнения предиката предложения where (WHERE e.ProductID = 48).
Вместо этого вы должны поместить этот предикат в условия соединения.
как это:
SELECT r.ID AS ShippingRateID, r.Name, e.*, r.*
FROM shipping r
LEFT JOIN shippingexceptions e
ON r.ID = e.ShippingRateID
And e.ProductID = 48
Далее, как рекомендовал ответ Джоэлса, для простого выражения, хотя регистр будет работать, вам не нужен оператор регистра, достаточно Coalesce:
SELECT r.ID AS ShippingRateID, r.Name,
Coalesce(e.rate, defaultrate) as Rate,
e.*, r.*
FROM shipping r
LEFT JOIN shippingexceptions e
ON r.ID = e.ShippingRateID
And e.ProductID = 48