SQL加入CASE和WHERE

Ech*_*lon 2 sql sql-server

我有三个表 - 一个用于运费,一个用于产品,一个用于特定产品的运费率例外.运费如下:每件商品都有运费,但此价格可以被例外所覆盖.如果产品不存在例外,则默认费率用于用户选择的运费. alt text http://mi6.nu/sqljoin.png 我正在尝试加入这些表,以便如果存在异常,则选择该价格,否则,选择默认价格但我遇到连接问题.我需要按产品ID查询,我有(第2行用于调试)

SELECT r.ID AS ShippingRateID, r.Name, 
e.*, r.*
FROM shipping r LEFT JOIN shippingexceptions e ON r.ID = e.ShippingRateID
WHERE e.ProductID = 48
Run Code Online (Sandbox Code Playgroud)

我需要回复:

1   Uk and Northern Ireland 1
2   EU Eire...      10
3   US and Canada       2.16
4   Rest of world       2.44
Run Code Online (Sandbox Code Playgroud)

因此,如果存在例外,则使用例外价格,否则使用默认价格.我打算使用CASE语句,但我需要先返回数据.

Joe*_*oel 8

为什么不使用coalesce

SELECT r.ID AS ShippingRateID, r.Name, coalesce(e.cost, r.defaultprice)
FROM shipping r LEFT JOIN shippingexceptions e ON r.ID = e.ShippingRateID
WHERE e.ProductID = 48
Run Code Online (Sandbox Code Playgroud)

这样,如果e.rate为null,则使用r.rate.

您还应该将e.ProductId放在连接上,这样就不会强制您只选择有异常的产品

SELECT r.ID AS ShippingRateID, r.Name, coalesce(e.cost, r.defaultprice)
FROM shipping r LEFT JOIN shippingexceptions e ON r.ID = e.ShippingRateID and e.ProductID = 48
Run Code Online (Sandbox Code Playgroud)