1

実行するとエラーを返す再帰クエリがあります。他のデータベース(より多くのデータを含む)では、問題はありません。私の場合、このクエリは再帰を実行する 2 つの列 (ID_PARENT と ID_CHILD) を返します。これは、ツリーが複数のレベルを持つことができるためです。「直接の」親のみが必要です。

注: クエリの最後に OPTION (MAXRECURSION 0) を配置しようとしましたが、うまくいきませんでした。次のクエリはクエリ全体の一部にすぎません。継続的に実行されるクエリを持つ「大きなクエリ」の最後にのみ OPTION を配置しようとしましたが、エラーは表示されませんでした。

SQL Server にエラーがあります:

「ステートメントが終了しました。ステートメントが完了する前に最大再帰 100 を使い果たしました」

クエリは次のとおりです。

WITH q
     AS (SELECT ID_ITEM,
                ID_ITEM AS ID_ITEM_ANCESTOR
         FROM   ITEMS_TABLE i
                JOIN ITEMS_TYPES_TABLE itt
                  ON itt.ID_ITEM_TYPE = i.ID_ITEM_TYPE
         UNION ALL
         SELECT i.ID_ITEM,
                q.ID_ITEM_ANCESTOR
         FROM   q
                JOIN ITEMS_TABLE i
                  ON i.ID_ITEM_PADRE = q.ID_ITEM
                JOIN ITEMS_TYPES_TABLE itt
                  ON itt.ID_ITEM_TYPE = i.ID_ITEM_TYPE)
SELECT ID_ITEM          AS ID_CHILD,
       ID_ITEM_ANCESTOR AS ID_PARENT
FROM   q 

このクエリを書き直して、再帰エラーを回避し、少数のデータを確認することを提案する必要があります。

4

2 に答える 2

1

OK、いくつかの調査の後、何らかの理由で、2 つのレコードに循環参照がありました: ITEM 1 は ITEM 2 の子であり、ITEM 2 は ITEM 1 の子でした​​。

値を手動で変更すると、クエリは完全に実行されます。

于 2012-12-04T17:26:25.237 に答える
0
WITH    q AS ( SELECT   ID_ITEM ,
                        ID_ITEM AS ID_ITEM_ANCESTOR
               FROM     ITEMS_TABLE i
                        JOIN ITEMS_TYPES_TABLE itt ON itt.ID_ITEM_TYPE = i.ID_ITEM_TYPE
               UNION ALL
               SELECT   i.ID_ITEM ,
                        q.ID_ITEM_ANCESTOR
               FROM     q
                        JOIN ITEMS_TABLE i ON i.ID_ITEM_PADRE = q.ID_ITEM
                        JOIN ITEMS_TYPES_TABLE itt ON itt.ID_ITEM_TYPE = i.ID_ITEM_TYPE
             )
    SELECT  ID_ITEM AS ID_CHILD ,
            ID_ITEM_ANCESTOR AS ID_PARENT
    FROM    q
OPTION  ( MAXRECURSION 500 )
于 2014-08-14T06:26:30.003 に答える