1. ホーム
  2. oracle

[解決済み] オラクル ユーザーデータでConnect By Loop

2022-02-10 04:21:58

質問内容

Oracleでループが発生する場合があることは理解しています。理論的には、あるレコードが他のノードの親であり、同時にそのノードの子である場合、ループに入る可能性があると言われています。

しかし、このクエリがなぜループしているのかがつかめません。

SELECT Empno, Ename, Job
FROM Emp
START WITH Empno = 7839
CONNECT BY PRIOR
Job='PRESIDENT'

このデータがどのようにループになるのか、どなたか教えてください。 CONNECT_BY_ISCYCLEを確認したところ、ループしているレコードはKING(President)であることがわかりました。 しかし、私はまだそれが可能であることが理解できない、KINGは大統領であり、私はそれがテーブル内の任意のレコードの両方の子と親になっている方法を参照してくださいです。

なぜこれがエラーになるのか、ループはどこにあるのか、説明してください。

よろしくお願いします。

参考までに、このテーブルはOracleのSCOTTユーザーのデフォルトのEMPテーブルです。

解決方法は?

<ブロッククオート

親行の子を見つけるために、OracleはPRIORを評価します。 親行に対する CONNECT BY 条件の式と、親行に対する その他の式は、テーブル内の各行に対して使用されます。この式が適用される行は 条件が真である場合、その親の子である。CONNECT BY 条件には、さらに行をフィルタリングするための他の条件を含めることができます。 はクエリによって選択されます。

CONNECT BY 条件が階層内のループを引き起こす場合、それは オラクルはエラーを返します。ループが発生するのは、1つの行が親であると同時に (祖父母または直系の先祖)であり、かつ子(または孫または直系の先祖)である。 別の行の直接の子孫)。

START WITH を満たし、かつ Job = 'PRESIDENT' を持つ行がない場合、ループは発生しません(Oracle は START WITH 行のみを取得します)。

テーブル内に START WITH を満たし、Job = 'PRESIDENT' を持つ行がある場合、どのような場合でもループが発生するためです。
1. Oracle は START WITH を満たすすべての行 (ルート行) を見つけます。
2. p.1 の各行について、Oracle はテーブル全体をスキャンして、子孫を探します。すべての行(p.1からの行を含む)がCONNECT BYの条件を満たす(先行ジョブ=「PRESIDENT」が常に真であるため)。
3. 明らかに ...