考慮以下數據模型: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的一部分。
我該如何寫一個查詢以期望的方式返回數據?任何和所有的幫助,非常感謝!
是否還有你的SQL匿名只是不好?因爲它似乎是從'OrderLine'或'OrderHeader'拉下來的,而忽略'ISNULL'語句中的CustomerAddress'? –
對不起,我將編輯問題以修復不正確的別名。謝謝! – TelJanini
您的表格結構看起來不正常。您是否可以修改表格結構,以便將所有地址行從訂單標題中刪除,並用單個賬單地址鍵替換? –