0

次のクエリで問題が発生しました。私はそれを最適化し、おそらく読みやすくしようとしています。3 つのテーブル orders_returned、orders_completed、orders_delivered があり、一致する列 oder_id、customer_id があるとします。選択したオプションによっては、配送されてから返され、最終的に完了した (3 つのテーブルすべてで同じ order_id が発生する) 同じ customer_id を持つ注文を取得する必要がある場合があります。また、配送された注文と返品された注文のみを取得する必要がある場合もあります。その場合は、 WHEREAND order_id IN (SELECT order_id FROM ORDERS_COMPLETED)から省略します。たとえば、ジョンとティム の顧客から配達された注文と返品された注文を取得します。今のところ、私のクエリは次のようになります。

SELECT order_id
FROM
(
    SELECT order_id, customer_id
    FROM ORDERS_RETURNED
    UNION
    SELECT order_id, customer_id
    FROM ORDERS_COMPLETED
    UNION
    SELECT order_id, customer_id
    FROM ORDERS_DELIVERED
)
WHERE 
    customer_id IN ('customer1', 'customer2', ...)
    AND order_id IN (SELECT order_id FROM ORDERS_RETURNED)
    AND order_id IN (SELECT order_id FROM ORDERS_COMPLETED)
    AND order_id IN (SELECT order_id FROM ORDERS_DELIVERED)

私はまだ SQL を学んでおり、より良いオプションがあるかどうかを確認したいと考えています。

編集:私はOracleデータベースを使用しています。個別の order_ids とその他の無関係な列を持つ Orders テーブルもあります。customer_ids は保存されません。また、順序は 1 つまたは 2 つのテーブルでのみ発生する可能性があるため、結合はここでは役に立たないと思います。

4

3 に答える 3

2

Orderテーブルがあるので、CustomerIdもそのテーブルに格納していると思います。そうだと仮定して、これを試してください:

SELECT DISTINCT O.OrderId
FROM Orders O
   LEFT JOIN Orders_Completed OC ON O.OrderId = OC.OrderId
   LEFT JOIN Orders_Delivered OD ON O.OrderId = OD.OrderId
   LEFT JOIN Orders_Returned ORE ON O.OrderId = ORE.OrderId
WHERE O.CustomerId IN (...)
   AND OD.OrderId IS NOT NULL AND ORE.OrderId IS NOT NULL AND OC.OrderId IS NULL

この特定のクエリは、注文が配達されて返送されたが完了していない顧客(...)のすべての個別の注文を返します。ISNULLとISNOTNULLの使用を切り替えて、目的の出力を取得します。

幸運を。

于 2013-02-03T08:34:42.740 に答える
0

内部/ネストされたクエリの代わりに結合を使用する必要があります。

代わりに以下を試してください::

SELECT A.order_id, A.customer_id FROM ORDERS_RETURNED A 
INNER JOIN ORDERS_COMPLETED B ON A.order_id = B.order_id AND A.customer_id = B.customer_id
INNER JOIN ORDERS_DELIVERED C ON A.order_id = C.order_id AND A.customer_id = C.customer_id
Where A.customer_id IN ('customer1', 'customer2', ...)
于 2013-02-03T08:22:34.087 に答える
0

次のようなものでこれを行うことができます:

with data
     as (select customer_id,
                order_id,
                nvl(max(case status when 'RETURNED' then 'Y' end), 'N') returned,
                nvl(max(case status when 'COMPLETED' then 'Y' end), 'N') completed,
                nvl(max(case status when 'DELIVERED' then 'Y' end), 'N') delivered
           from (select 'RETURNED' status, order_id, customer_id
                   from orders_returned
                 union all
                 select 'COMPLETED' status, order_id, customer_id
                   from orders_completed
                 union all
                 select 'DELIVERED' status, order_id, customer_id
                   from orders_delivered)
          group by customer_id, order_id)
select *
  from data
 where returned = 'Y'
   and delivered = 'Y'
   and customer_id in ('xx', 'xxx') ;

また

with data
     as (select customer_id,
                order_id,
                max(returned) returned,
                max(completed) completed,
                max(delivered) delivered
           from (select 'Y' returned, null completed, null delivered, order_id, customer_id
                   from orders_returned
                 union all
                 select null, 'Y', null, order_id, customer_id
                   from orders_completed
                 union all
                 select null, null, 'Y', order_id, customer_id
                   from orders_delivered)
          group by customer_id, order_id)
select *

from data where returned = 'Y' and delivery = 'Y' and customer_id in ('xx', 'xxx');

例: http://sqlfiddle.com/#!4/3e2fb/2

于 2013-02-03T14:12:54.330 に答える