sql >> データベース >  >> RDS >> Oracle

再帰クエリの実行中にサイクルが検出されました

    再帰メンバーでは、現在a.product_id = b.product_idでのみ参加しています 、a.order_id = b.order_id AND a.product_id = b.product_idではなく;これはここでは直接問題ではありませんが、異なる注文に同じ製品が含まれている場合は、現実の世界で発生する可能性があります。

    ただし、データとクエリには実際にはサイクルがないようです。 ANSI結合のバグと思われるものにつまずいているようです。 cycleを追加する 句は、期待どおりに循環行を明らかにしません-そしてそれを機能させます!;古いスタイルの結合で機能します:

    WITH
        cte (order_id,
             product_id,
             quantity,
             cnt)
        AS
            (SELECT order_id,
                    product_id,
                    1 as quantity,
                    1 as cnt
               FROM order_tbl2        
             UNION ALL
             SELECT a.order_id,
                    a.product_id,
                    b.quantity,
                    b.cnt + 1
               FROM order_tbl2 A, cte b
              WHERE b.cnt + 1 < a.quantity
                AND a.order_id = b.order_id
                AND a.product_id = b.product_id
                )
    SELECT order_id, product_id, quantity
      FROM cte;
    

    db<>フィドル

    ただし、参加する必要はまったくありません。あなたができること:

    WITH
        cte (order_id,
             product_id,
             quantity,
             cnt)
        AS
            (SELECT order_id,
                    product_id,
                    quantity,
                    1 as cnt
               FROM order_tbl2        
             UNION ALL
             SELECT b.order_id,
                    b.product_id,
                    b.quantity,
                    b.cnt + 1
               FROM cte b
              WHERE  b.cnt < b.quantity)
    SELECT order_id, product_id, 1 as quantity
      FROM cte;
    

    最終選択で固定1数量を割り当てる、または:

    WITH
        cte (order_id,
             product_id,
             real_quantity,
             quantity,
             cnt)
        AS
            (SELECT order_id,
                    product_id,
                    quantity as real_quantity,
                    1 as quantity,
                    1 as cnt
               FROM order_tbl2        
             UNION ALL
             SELECT b.order_id,
                    b.product_id,
                    b.real_quantity,
                    b.quantity,
                    b.cnt + 1
               FROM cte b
              WHERE  b.cnt < b.real_quantity)
    SELECT order_id, product_id, quantity
      FROM cte;
    

    これはそれを内部に割り当て、元の数量を新しいエイリアスとして追跡する必要があります。

    どちらの場合も、+ 1を削除しました 量の比較から、それはそれをあまりにも早く停止させていたので; order by さらに、両方とも次のようになります。

    ORDER_ID PRODUCT_ID 数量
    ORD1 PROD1 1
    ORD1 PROD1 1
    ORD1 PROD1 1
    ORD1 PROD1 1
    ORD1 PROD1 1
    ORD2 PROD2 1
    ORD2 PROD2 1
    ORD3 PROD3 1
    ORD3 PROD3 1
    ORD3 PROD3 1

    db <> fiddle



    1. uuidを数値として保存する方法は?

    2. クラウドサイトでのデータベースの作成

    3. WHERE句とINNERJOINが機能しないMySQL更新クエリ

    4. アクションスケジューラから投稿とコメントを削除する