1

考虑以下数据模型:

顾客

CustNum | First Name | Last Name
  555        John         Doe

客户地址

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

订单头

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  

客户和客户地址之间存在一对多的关系。
每个 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  

使用上面的查询,如果为 OrderHeader 定义了 Line2 字段,但在 OrderLine 中定义了 ShippingAddress,则可以为 Y234 项目返回混合地址:

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

请注意,Ste 1 不是 OrderLine 中表示的地址的一部分,它实际上是 OrderHeader 的一部分。
如何编写查询以以所需的方式返回数据?非常感谢任何和所有帮助!

4

1 回答 1

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
于 2013-04-15T06:45:30.710 回答