我加入了两张桌子。
ACCOUNTS
account_number region product
1234 100 AB
2345 0 AB
3456 300 CD
4567 0 CD
PRODUCTS
product region price
AB 100 $1.50
AB 0 $1.25
CD 0 $2.00
每个帐户记录都有一个区域和一个产品代码 根据产品代码和地区,产品是独一无二的。
但是,业务逻辑表明,如果PRODUCTS表中没有匹配的区域,请使用0区域来获取价格。
因此,我必须按产品和地区加入以获得特定地区的定价。在该示例中,帐户1234,2345& 4567找到匹配的记录。
但我需要找到一种方法让3456加入产品CD的0区域。
我想我可以(ACCOUNTS离开加入PRODUCTS),然后将任何空格价格强制区域更新为0,但这有多丑?
有什么想法吗?
此外,我正在使用供应商应用程序,因此无法更改架构或数据。
数据库:MS SQLSERVER 2005
答案 0 :(得分:3)
您应该能够像这样进行双重连接:
SELECT a.account_number, a.region, a.product, ISNULL(p1.price, p2.price) AS Price
FROM Accounts a
LEFT JOIN Products p1 ON a.product = p1.product AND a.region = p1.region
LEFT JOIN Products p2 ON a.product = p2.product AND p2.region = 0
答案 1 :(得分:2)
对我而言,这并不难看,可以做这样的事情
SELECT coalesce(regional.price, general.price) as EffectivePrice
FROM Accounts
LEFT JOIN Products as Regional
ON Account.Product = Regional.Product and Accounts.Region = Regional.Region
LEFT JOIN Products as General
ON Account.Product = General.Product and General.Region = 0
答案 2 :(得分:1)
虽然不是100%优雅的解决方案,但这适用于SQL Server。您应该使用子查询来获取默认价格,但为了清楚起见,我这样做了。
DECLARE @Price DECIMAL(9,2)
SELECT @Price = price FROM Products WHERE Region = 0
SELECT
A.accountNumber,
A.Product,
ISNULL(P.Price, @Price) AS Price
FROM Accounts A
LEFT OUTER JOIN Products P
ON (A.Region = P.Region
AND A.Product = P.Product)