考虑以下数据模型:
顾客
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 的一部分。
如何编写查询以以所需的方式返回数据?非常感谢任何和所有帮助!