2

私は2つのテーブルを持っていOrderますOrderItem. には 1 対多の関係があります。Order.Order_ID=OrderItem.Order_ID

各注文のステータス、COMPLETE または INCOMPLETE を示すリストを返すクエリが必要です。

COMPLETE Order は、関連するすべての OrderItem レコードNULLのフィールドに非空でない値があるものとして定義されOrderItem.Delivery_IDます。

これは私がこれまでに持っているものです:

  SELECT Order.Order_ID, 'INCOMPLETE' AS Order_status
  FROM Order 
  WHERE EXISTS
    (SELECT *
     FROM OrderItem 
     WHERE OrderItem.Order_ID=Order.Order_ID 
     AND (OrderItem.Delivery_ID IS NULL OR OrderItem.Delivery_ID=''))
UNION 
  SELECT Order.Order_ID, 'COMPLETE' AS Order_status
  FROM Order 
  WHERE NOT EXISTS
    (SELECT *
     FROM OrderItem 
     WHERE OrderItem.Order_ID=Order.Order_ID 
     AND (OrderItem.Delivery_ID IS NULL OR OrderItem.Delivery_ID=''))
ORDER BY Order_ID DESC

動作しますが、動作が少し遅くなります。より良い方法はありますか?

(注意: わかりやすくするために問題を再度述べました。実際のテーブル名とフィールド名は異なります)

4

3 に答える 3

1

これを試してみてください -

SELECT 
       o.Order_ID
     , Order_status = 
               CASE WHEN ot.Order_ID IS NULL 
                    THEN 'COMPLETE' 
                    ELSE 'INCOMPLETE' 
               END
FROM dbo.[Order] o
LEFT JOIN (
     SELECT DISTINCT ot.Order_ID
     FROM dbo.OrderItem ot
     WHERE ISNULL(ot.Delivery_ID, '') = '' 
) ot ON ot.Order_ID = o.Order_ID 
于 2013-06-26T05:50:27.670 に答える
1

これをサブクエリに入れて、case ステートメントの混乱を軽減しようとします。

SELECT Order_ID,
       CASE WHEN incomplete_count > 0 THEN 'INCOMPLETE' ELSE 'COMPLETE' END
           AS Order_status

  FROM ( SELECT o.Order_ID
               ,SUM( CASE WHEN OrderItem.Delivery_ID IS NULL OR OrderItem.Delivery_ID='' THEN 1 ELSE 0 END )
                 AS incomplete_count
           FROM Order o 
           INNER JOIN OrderItem i ON (i.Order_ID = o.Order_ID)
           GROUP by o.Order_ID
       ) x

   ORDER BY ORder_ID DESC

アイデアは、null アイテムに遭遇するたびにカウンターを保持することです。合計が 0 の場合、空の注文項目はありませんでした。

于 2013-06-26T02:54:36.700 に答える