需要SQL连接的帮助:条件匹配?

时间:2010-02-11 15:55:40

标签: sql sql-server sql-server-2005 join

我加入了两张桌子。

              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

3 个答案:

答案 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)