3

私は次のデータを持っています

Order_ID  Pallet_ID
O1        P1
O2        P1
O2        P2
O3        P2
O3        P3
O4        P4

注文が複数のパレットにある場合や、1 つのパレットに複数の注文がある場合。グループを構成する注文のグループを選択する必要があります。それらはすべて同じグループのパレットを共有しています。上記のテスト データでは、{O1,O2,O3} および {O4} という 2 つのグループが存在します。これは、O1、O2、および O3 がグループの別のメンバーと共通のパレットを少なくとも 1 つ持っているためです。

これを行うには、いくつかのSQLが必要です。試してみました(greg_testには上記のデータが含まれています)

select distinct order_id
from greg_test
start with order_id = :order_id
connect by pallet_id = prior pallet_id

しかし、循環参照エラー (ORA-01436 CONNECT BY loop in user data) が発生しました。nocycle を追加しても、正しいセットが得られませんでした。

4

2 に答える 2

2

このクエリは、単一の全表スキャンのみを使用するか、インデックスがある場合はインデックス範囲スキャンを使用できます。

select distinct order_id
from greg_test
start with order_id = :order_id
connect by nocycle pallet_id = prior pallet_id or order_id = prior order_id;

11gR2を使用している場合、構文は奇妙なIMOですが、これは上記のクエリによる接続よりも少し速く実行されます。

with orders(order_id, pallet_id) as
(
    select order_id, pallet_id
    from greg_test
    where order_id = :order_id
    union all
    select greg_test.order_id, greg_test.pallet_id
    from greg_test
    inner join orders
        on greg_test.pallet_id = orders.pallet_id
            or greg_test.pallet_id = orders.pallet_id
) cycle order_id, pallet_id set is_cycle to 'Y' default 'N'
select distinct order_id from orders;

大量のデータがある場合は、使用するソリューションを徹底的にテストする必要があります。階層クエリには、多くの場合、深刻なパフォーマンスの問題があります。

于 2011-03-23T04:47:48.823 に答える
1
-- Z lists all order pairs that share a pallet, and also pairs each order with itself
WITH pairs AS (
    -- all pairs of orders on the same pallet
    SELECT DISTINCT a.order_id a, b.order_id b FROM greg_test a, greg_test b 
    WHERE a.pallet_id = b.pallet_id AND a.order_id != b.order_id
  UNION ALL 
    -- pair all orders with themselves
    SELECT DISTINCT order_id a, order_id b FROM greg_test
)
-- Now connect all the pairs
SELECT DISTINCT a FROM pairs 
CONNECT BY NOCYCLE PRIOR a = b 
START WITH a = :order_id

おそらく、より効率的な解決策があります。

于 2011-03-22T21:50:06.807 に答える