2013-04-15 152 views
1

考慮以下數據模型:ISNULL/COALESCE多個領域

客戶

CustNum | First Name | Last Name 
    555  John   Doe 

CustomerAddresses

CustNum | ShippingAddress|  Line1  | Line2 | City | State | Zip  
    555 |  ADD1  | 333 A Dr. | Apt. 10 | Dallas | TX | 11345 
    555 |  ADD2  | 111 B St. | NULL | Miami | FL | 22222 
    555 |  WXYZ  | 123 Main St. | NULL | Detroit | MI | 99998 

OrderHeader

OrdNum | CustNum | OrderTotal |  Line1  | Line2 | City | State| Zip 
1000 | 555 | 67.00 | 123 Main St. | Ste 1 | Detroit | MI | 99998 

訂單行

OrderNo | Item | Price | ShippingAddress 
1000 | X123 | 32.00 |  ADD1 
1000 | Y234 | 25.00 |  ADD2 
1000 | ZZZZ | 10.00 |  NULL 

有客戶和CustomerAddresses之間的一個一對多的關係。
每個OrderHeader代替與CustomerAddresses表的關鍵關係,將用於裝運的地址存儲在Line1,Line2,City,State和Zip字段中。
另外,可以在OrderLine表中選擇一個覆蓋OrderHeader中存儲地址的送貨地址。
我試圖想出一個查詢,按以下格式返回數據,生成郵件標籤的列表:
MailingLabels

OrderNo | Item |  Line1  | Line2 | City | State | Zip  
1000 | X123 | 333 A Dr. | Apt. 10 | Dallas | TX | 11345 
1000 | Y234 | 111 B St. | NULL | Miami | FL | 22222 
1000 | ZZZZ | 123 Main St. | NULL | Detroit | MI | 99998 

基本上,如果OrderLine的記錄有ShippingAddress值,我想從CustomerAddresses表中返回相應的地址。
如果它是NULL,那麼我想返回存儲在OrderHeader表中的Line1,Line2,City,State和Zip值。
問題是,當我使用COALESCE或ISNULL時,可能會返回不正確的結果。這裏是我的查詢:

SELECT OH.OrderNo, Item, ISNULL(CA.Line1, OH.Line1), ISNULL(CA.Line2, OH.Line2), 
     ISNULL(CA.City, OH.City), ISNULL(CA.State, OH.State), ISNULL(CA.Zip, OH.Zip) 
FROM OrderHeader OH 
JOIN OrderLine OL 
ON  OH.OrderNo = OL.OrderNo 
LEFT JOIN CustomerAddress CA 
ON  OL.CustNum = CA.CustNum 
AND OL.ShippingAddress = CA.ShippingAddress 

有了上面的查詢,如果該線路2場爲OrderHeader定義,但ShippingAddress在OrderLine的定義,有可能爲Y234項目回報混合地址:

OrderNo | Item | Line1 | Line2 | City | State | Zip    
1000 | Y234 | 111 B St. | Ste 1 | Miami | FL | 22222 

請注意,Ste 1不是OrderLine中指定地址的一部分,它實際上是OrderHeader的一部分。
我該如何寫一個查詢以期望的方式返回數據?任何和所有的幫助,非常感謝!

+0

是否還有你的SQL匿名只是不好?因爲它似乎是從'OrderLine'或'OrderHeader'拉下來的,而忽略'ISNULL'語句中的CustomerAddress'? –

+0

對不起,我將編輯問題以修復不正確的別名。謝謝! – TelJanini

+0

您的表格結構看起來不正常。您是否可以修改表格結構,以便將所有地址行從訂單標題中刪除,並用單個賬單地址鍵替換? –

回答

6

不幸的是,我想不出一個簡單的方法來做到這一點,而不是相當重複。

假設OL別名應該是CA

SELECT OH.OrderNo, Item, 
     CASE WHEN OL.ShippingAddress IS NULL THEN OH.Line1 ELSE CA.Line1 END, 
     CASE WHEN OL.ShippingAddress IS NULL THEN OH.Line2 ELSE CA.Line2 END, 
     CASE WHEN OL.ShippingAddress IS NULL THEN OH.City ELSE CA.City END, 
     CASE WHEN OL.ShippingAddress IS NULL THEN OH.State ELSE CA.State END, 
     CASE WHEN OL.ShippingAddress IS NULL THEN OH.Zip ELSE CA.Zip END 
FROM OrderHeader OH 
JOIN OrderLine OL 
ON  OH.OrderNo = OL.OrderNo 
LEFT JOIN CustomerAddress CA 
ON  OL.CustNum = CA.CustNum 
AND OL.ShippingAddress = CA.ShippingAddress 
+0

我忘了CASE,謝謝!我認爲你是對的,因爲地址字段的確定必須基於特定的列進行。 – TelJanini