3

:クエリが含まれている自己参照テーブルで実行される無限ループI 3つのエントリがテーブルの上に、<a href="http://junit.org/junit4/" rel="nofollow">JUnit</a>を使用して実行されたテストを介し<a href="http://www.h2database.com/html/main.html" rel="nofollow">H2 database</a>に次のクエリを実行してい

WITH ancestors(ID, PARENT_ID) AS 
(
    SELECT ID, PARENT_ID FROM PEOPLE WHERE ID = <person_id> 
    UNION ALL 
    SELECT P1.ID, P1.PARENT_ID FROM PEOPLE P1, PEOPLE P2 WHERE P1.ID = P2.PARENT_ID 
) 
SELECT ID FROM ancestors; 

人。それは人のすべての祖先のIDを見つける。

これは何らかの理由で、テストがハングアップすると無限ループになると思われますが、RAM使用率が急上昇(2GB以上)することがわかります。 なぜこれが起こっているのですか?どのように修正できますか?

観察:

  • それがうまく実行されるテーブルで指定されていませんPARENT_IDがない場合、これは
  • オラクル
  • に罰金実行しますが、存在する場合、それがハングアップし、継続的にRAMの使用量が増加します。

答えて

1

だから、問題はCTEに関連する必要があなたの第二select文に関連しているが、テーブル

をacenstorsだから私のクエリに基づいて、どのようなことはやっていることは)

1であるので、第一クエリ開始ノードが追加され、一度実行されます。たとえば、ID = "John"、Parent_ID = "Rob"

2)何度も実行される2番目のクエリは、 "ON P1"に参加しているので、人物ID = "Rob" .PARENT_ID = P2.ID "。例)これは[ID = "ROB"、Parent_ID = "Susan"]とID = "ROB"、Parent_ID = "Paul"を追加します。

3)シーンの後ろで、今回は人名SusanとPaulを見て、それを祖先のテーブルに追加します。これはそれ以上のレコードが返されなくなるまで行われます。

WITH ancestors(ID, PARENT_ID) AS 
(
    --child 
    SELECT 
     ID, 
     PARENT_ID 
    FROM PEOPLE 
    WHERE ID = <person_id> 

    UNION ALL 

    --get my lineage 
    SELECT 
     P2.ID, 
     P2.PARENT_ID 
    FROM ancestors P1 
    INNER JOIN PEOPLE P2 
     ON P1.PARENT_ID = P2.ID 
) 
SELECT ID FROM ancestors; 
+0

2番目の選択は間違いなくP1を返す必要があります。私はWHEREの代わりにINNER JOINに変更しようとしましたが、違いはありません。 –

+0

私は私の質問で間違いを犯しました。 2番目のクエリはCTEテーブル "先祖"と結合し、P2値を返す必要があります。それ以外の場合は、同じルートノードを使用します。 – dfdsfdsfsdf

+0

これも試しましたが、の値(祖先はありません)だけが返されます。 –

関連する問題

 関連する問題