1

私は4つのテーブルを持っています:

注文:

OrderID Detail  Discount
------------------------
1001    xxx     True
1002    xxx     True
1003    xxx     True
1004    xxx     False
1005    xxx     True
1006    xxx     True

OrderDiscounts:

OrderID DiscountTypeID  DiscountID
----------------------------------
1001     1              8
1002     2              12
1003     1              9
1005     2              13
1006     2              9

クーポンDiscountTypeID = 1):

CouponID    Title
------------------------
8           CouponTitle8
9           CouponTitle9

キャンペーンDiscountTypeID = 2):

CampaignID  Title
--------------------------
9           CampaignTitle9
12          CampaignTitle12
13          CampaignTitle13

4つのテーブルすべてを1つのテーブルにマージするクエリが必要です。これにより、次のような結果が得られます。

結果:

OrderID Discount    DiscountType    DiscountTitle
-----------------------------------------------------
1001    True        Coupon          CouponTitle8
1002    True        Campaign        CampaignTitle12
1003    True        Coupon          CouponTitle9
1004    False               
1005    True        Campaign        CampaignTitle13
1006    True        Campaign        CampaignTitle9

一部のクーポンIDがキャンペーンIDとして存在する場合があることに注意してください。このシナリオでは、CouponIDとCampaignIDの両方に「9」が存在します。

必要なクエリに加えて、クエリを作成するときにそのようなコマンドを使用する方法/理由についての適切な説明は、答えを探すだけでなく、自分でも同様のシナリオを処理したいので、すばらしいでしょう。ありがとう!

4

2 に答える 2

2

次のコードは機能するはずです-少し変更を加えて実行しました:「DiscountType」テーブルを追加しました。

たぶんあなたが探しているのは素早く簡単な答えだけだと理解していますが、データスキーマはもっとうまくセットアップできると思います。割引タイプごとにテーブル全体を用意することは、スケーラブルでも柔軟性でもありません。提案されたようなクエリは、時間が経つにつれて、より毛深い、厄介な、そして意味のあるものになるだけです。もちろん、それはすべてあなたの要件に依存します。

SELECT
  OrderId = o.OrderId,
  Discount = CASE WHEN o.Discount = 1 THEN 'True' ELSE 'False' END,
  DiscountType = COALESCE(dt1.DiscountType, dt2.DiscountType, ''),
  DiscountTitle = COALESCE(coup.Title, camp.Title, '')
FROM
  Orders o
  LEFT JOIN 
    (OrderDiscounts od1       
     JOIN Coupons coup ON coup.CouponID = od1.DiscountID
     LEFT JOIN DiscountType dt1 ON dt1.DiscountTypeId = od1.DiscountTypeId
     ) ON o.OrderId = od1.OrderId
       AND o.Discount = 1
       AND od1.DiscountTypeID = 1
  LEFT JOIN 
    (OrderDiscounts od2 
     JOIN Campaigns camp ON camp.CampaignID = od2.DiscountID
     LEFT JOIN DiscountType dt2 ON dt2.DiscountTypeId = od2.DiscountTypeId
     ) ON 
       od2.OrderID = o.OrderID 
       AND o.Discount = 1
       AND od2.DiscountTypeID = 2

ここSqlFiddleで自分の目で確かめてください。

于 2013-03-08T21:17:55.923 に答える
1

以下のようになります。

SELECT Orders.OrderID,
CASE when OrderDiscounts.OrderID is NULL THEN False ELSE True end,
CASE when OrderDiscounts.DiscountTypeID  = 1 THEN 'Coupon' 
     when OrderDiscounts.DiscountTypeID  = 2 THEN 'Campaign' 
     else '' end,
CASE WHEN OrderDiscounts.DiscountTypeID  = 1 THEN Coupons.Title 
     WHEN OrderDiscounts.DiscountTypeID  = 2 THEN Campaigns.Title  
     ELSE '' end
FROM Orders
LEFT JOIN OrderDiscounts on Orders.OrderID = OrderDiscounts.OrderID
LEFT JOIN Coupons on OrderDiscounts.DiscountID = Coupons.CouponID
LEFT JOIN Campaigns on OrderDiscounts.DiscountID = Campaigns.CampaignID
于 2013-03-08T20:46:49.190 に答える