0

Oracle pl/sql に階層テーブルがあります。何かのようなもの:

create table hierarchical (
   id             integer primary key,
   parent_id          references hierarchical ,
   name           varchar(100));

そのテーブルを変更するプロシージャを作成して、ノードごとに子があるかどうかを示す新しいフィールドを取得する必要があります。

単一の手順で変更と更新を行うことは可能ですか? コードサンプルは大歓迎です。

ありがとう

4

2 に答える 2

2

ALTER TABLE( DDL ) とUPDATE( DML ) を 1 つのステップで実行することはできません。

を実行しALTER TABLE、その後に を実行する必要がありUPDATEます。

BEGIN
  EXECUTE IMMEDIATE 'ALTER TABLE hierarchical ADD child_count INTEGER';
  --
  EXECUTE IMMEDIATE '
  UPDATE hierarchical h
  SET child_count = ( SELECT COUNT(*)
                      FROM hierarchical h2
                      WHERE h2.parent_id = h.id )';
END;

ただし、これを行う前によく考えてください。idにクエリを持つ子があるかどうかを簡単に確認できるようになりました。

これは、たとえば、すべてのトップノードの子の数を示します。

SELECT h.id, h.name, COUNT(childs.id) child_count
FROM hierarchical h
LEFT JOIN hierarchical childs ON ( childs.parent_id = h.id )
WHERE h.parent_id IS NULL
GROUP BY h.id, h.name

冗長データを含む余分な列を追加すると、子を追加/削除するときに常に親も更新する必要があるため、データの変更がより困難になります。

于 2010-03-18T14:37:41.657 に答える
0

子が存在するかどうかだけを知る必要がある場合は、ループや非正規化された列を使用せずに次のクエリを実行できます。

    select h.*, connect_by_isleaf as No_children_exist
      from hierarchical h
start with parent_id is null
connect by prior id = parent_id; 

CONNECT_BY_LEAF は、行に子がある場合は 0 を返し、ない場合は 1 を返します。

分析関数と LEVEL 疑似列を巧みに使用することで、おそらく正確な子の数を取得できると思いますが、よくわかりません。

于 2010-03-18T17:25:08.103 に答える