2010-02-11 50 views
2

我加入了2張桌子。需要SQL連接的幫助:條件匹配?

   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 left join PRODUCTS)然後更新任何零價格強制區域爲0,但這有多醜?

任何想法?

另外,我正在使用供應商應用程序,因此我無法更改模式或數據。

數據庫:MS SQLSERVER 2005

+0

哪個數據庫? – 2010-02-11 15:58:09

回答

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 
+0

就是這樣。謝謝! – 2010-02-11 16:13:23

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) 
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 
+0

你也是,很好的回答! – 2010-02-11 16:14:15