最近、階層的なデータを表示するための再帰的なクエリである共通のテーブル式を見つけました(下のクエリと(部分的に)結果を参照)。 私は、クエリがどのように構築され、一般的にどのようなものかを理解していますが、内部結合を使用して各行で適切なレベルを取得するためのロジックは得られません。 誰かが私にこれを明確にしてもらえますか? 私の質問は、行3がレベル1、行7がレベル2、行8がレベル3などのクエリを「計算する」方法です。 ありがとうございます。 Arjen。 CTEのロジックを理解して助けてください
答えて
OrgReport
は、この名前付きクエリの名前です。これはこのCTEで定義され、(再帰CTEの専門として)、それはクエリの2番目の「再帰的な」部分でも使用されることに注意してください。
最初のアンカー部分では、列(最初の行で定義された列名)に0
が選択されています。
2番目の「再帰的」部分では、Level
の値はLevel + 1
と計算されます。 Employee
テーブルにそのような列が含まれていないので、Level + 1
式のLevel
は、OrgReport
というクエリからLevel
列を参照します。したがって、階層内の次のレベルの行の値はLevel
です。自分自身とのJOIN
背後
論理はおおよそ「その後(増加Level
値で)結果にそれらの従業員を追加し、そのマネージャーがすでに持っている結果である従業員と、これまであなたが持っている結果を結合」です。新しい行が追加されている間は、繰り返します。
重要な情報は、開始時に「アンカー」部分が1回だけ実行されている間は、「再帰的」部分が繰り返し実行されていることです(したがって、Empolyees
テーブルの新しい行が結合条件) - 新しい行が追加されている限り、つまり問合せが行を戻す限り、2番目の部分が繰り返されます。
ありがとうあなたの答えは、私が完全に理解しているアンカー部分です。私は内部結合がこのすべてを達成する方法を理解していません。 – seethestars
最初に、アンカー部分から最初のデータを取得し、このデータをマネージャが属する従業員に結合します最初のデータ(再帰部分ごとに)を追加し、結果に新しい行を追加してから、これらの新しい行を取り出し、再帰部分*ごとに従業員と結合し、結果に新しい行を追加してこれは新しい行が追加されている限りです –
Jiri、ありがとう、私はついにこれを理解しました! )私はすぐにこのことを理解していないので、少し心配しています:p – seethestars
http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so-when-asking-a-question/285557#285557 –