0

SQL Server 2008 では;

私は木を持っています。ノード n のすべての子ノード (図を参照) と、これらの子ノードのすべての子ノードなどを取得する必要がありますが、これは非常に簡単です。また、「ノード o を取り、m に到達するまでツリーを上っていき、m はノード n の子であるため、ノード o のプロパティをノード m のプロパティに設定する」と言うことができる必要があります。ノード o は、3 レベルの深さ (図のように) または 45 レベルの深さ、x レベルの深さである可能性があります。

これは、指定されたノード (または領域) のすべての子を取得します。

    --Return all sub-area structure of an area:

      WITH temp_areas (ParentAreaID, AreaID, [Name], [Level]) AS
      (
            SELECT ParentAreaID, AreaID, [Name], 0
            FROM lib_areas WHERE AreaID = @AreaID
            UNION ALL
            SELECT B.ParentAreaID, B.AreaID, B.[Name], A.Level + 1
            FROM temp_areas AS A, lib_areas AS B
            WHERE A.AreaID = B.ParentAreaID
      )

INSERT INTO @files (id) SELECT fileid FROM lib_filesareasxref where areaid in (select  areaid from temp_areas)

while exists (select * from @files)
begin
select top 1
@ID = id
from
@files ORDER BY id DESC

delete from @files where id = @id

木

4

2 に答える 2

2

これは、到達するまで、またはツリーの最上部に到達する@node_oまで追跡します(上にない場合)@node_m@node_m@node_o

  WITH
    parents
  AS
  (
    SELECT
      A.ParentAreaID, A.AreaID, A.[Name], 0
    FROM
      lib_areas  AS A
    WHERE
      A.AreaID = @node_o

    UNION ALL

    SELECT
      A.ParentAreaID, A.AreaID, A.[Name], B.Level + 1
    FROM
      lib_areas  AS A
    INNER JOIN
      parents    AS B
        ON A.AreaID = B.ParentAreaID
    WHERE
      B.AreaID <> @node_m
  )
  SELECT
    *
  FROM
    parents
于 2012-07-06T09:11:00.813 に答える
0

HierarchyIDテーブルでデータ型を使用し、GetAncestorメソッドを使用することをお勧めします

于 2012-07-06T09:18:11.443 に答える