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  

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 の一部であることに注意してください。
目的の方法でデータを返すクエリを作成するにはどうすればよいですか? どんな助けでも大歓迎です!

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 に答える