SQL 解説書

例 3: 深さの制御

この表の中に存在する部品のレベルが、 とりあえず照会で必要なレベルより深い場合はどうなるのでしょうか。 つまり、 「'01' で指定される部品を作成するために必要な部品の最初の 2 つのレベルはどんなものか」 という質問に答えるためには、どんな照会を作成したらよいでしょうか。 例をわかりやすいものにするため、レベル番号を結果に含めることにします。

WITH RPL (LEVEL, PART, SUBPART, QUANTITY) AS
      (
         SELECT 1,               ROOT.PART, ROOT.SUBPART, ROOT.QUANTITY
          FROM PARTLIST ROOT
          WHERE ROOT.PART = '01'
       UNION ALL
         SELECT PARENT.LEVEL+1, CHILD.PART, CHILD.SUBPART, CHILD.QUANTITY
          FROM RPL PARENT, PARTLIST CHILD
          WHERE PARENT.SUBPART = CHILD.PART
            AND PARENT.LEVEL < 2
      )
 SELECT PART, LEVEL, SUBPART, QUANTITY
   FROM RPL;

この照会は例 1 に似ています。 元の部品からのレベルを示すために、列 LEVEL を使っています。 初期化全選択では、LEVEL 列の値を 1 に初期化しています。 それ以降の全選択では、親のレベルに 1 ずつ加算します。 次に、結果のレベル数を制御するため、2 番目の全選択に、 親のレベルが 2 未満でなければならないという条件を含めています。 これによって、2 番目の全選択では、 子の処理が第 2 レベルまでしか行われないことになります。

照会結果は、次のようになります。

  PART     LEVEL       SUBPART  QUANTITY
  -------- ----------- -------- -----------
  01                 1 02                 2
  01                 1 03                 3
  01                 1 04                 4
  01                 1 06                 3
  02                 2 05                 7
  02                 2 06                 6
  03                 2 07                 6
  04                 2 08                10
  04                 2 09                11
  06                 2 12                10
  06                 2 13                10


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]