次のデータ モデルを検討してください。
お客様
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
Customers と CustomerAddresses の間には 1 対多の関係があります。
各 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 の一部であることに注意してください。
目的の方法でデータを返すクエリを作成するにはどうすればよいですか? どんな助けでも大歓迎です!