Нужна помощь с соединением SQL: условное сопоставление? - PullRequest
2 голосов
/ 11 февраля 2010

Я присоединяюсь к 2 таблицам.

              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 присоединиться к региону 0 для CD продукта.

Полагаю, я мог бы (СЧЕТАМ осталось присоединиться к ПРОДУКТАМ), а затем обновить любой нулевой ценовой принуждающий регион до 0, но насколько это уродливо?

Есть идеи?

Кроме того, я работаю с приложением поставщика, поэтому не могу изменить схему или данные.

База данных: MS SQLSERVER 2005

Ответы [ 3 ]

3 голосов
/ 11 февраля 2010

У вас должно получиться двойное соединение:

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
2 голосов
/ 11 февраля 2010

Для меня это не безобразно, было бы хорошо сделать что-то подобное

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
1 голос
/ 11 февраля 2010

Хотя это не 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)
...