2

重複の可能性:
データベースにディレクトリ/階層/ツリー構造を保存する方法は?

私はこのクエリを使用します:

SELECT Id, Name, ParentId
FROM Table_1

そして、すべての要素を使用してツリーを構築します。

しかし、definiteから始まるツリーを構築したい場合はどうなるので、これとこれのすべての子Idのみを返すクエリを作成する必要があります 。IdId

SELECT Id, Name, ParentId
FROM Table_1
WHERE (Id = randomNumber) OR (all possible childs of Id = randomNumber)

質問をするのを手伝ってください。

編集:

これが、Oracleでそれを実現する方法です。

SELECT Id, Name, ParentId
FROM table_1
Connect by prior Id = ParentId
Start with Id = randomNumber

MS-Accessが必要です

4

4 に答える 4

1

これを試してみてください、これがあなたが探しているものであることを願っています:

DECLARE @ID int

SET @ID = 1;

WITH CTE_Table_1
(
 ID,
 Name,
 ParentID,
 TreeLevel
)
AS(
  SELECT 
   ID,
   Name,
   ParentID,
   0 AS TreeLevel
  FROM Table_1
  WHERE ID = @ID

  UNION ALL

  SELECT 
   T.ID,
   T.Name,
   T.ParentID,
   TreeLevel + 1
  FROM Table_1 T
  INNER JOIN CTE_Table_1 ON CTE_Table_1.ID = T.ParentID
)

SELECT * FROM CTE_Table_1
于 2012-08-23T18:26:06.093 に答える
0

親IDを子IDにリンクするテーブル自体に参加できます

SELECT T1.Id, T1.Name, T2.Id, T2.Name
FROM   Table_1 as T1
JOIN   Table_1 as T2 on T1.Id = T2.ParentId

データを考えると

Id, Name       ParentId
1,  Top,        null
2,  ChildOne,   1
3,  ChildTwo,   1
4,  ChildThree, 1

これにより、次のような結果が得られます

1,   Top,    2, ChildOne
1,   Top,    3, ChildTwo
1,   Top,    4, ChildFour
于 2012-08-23T16:31:56.763 に答える
0

あなたはほとんどそこにいます、これはトリックを行うはずです

SELECT Id, Name, ParentId 
FROM Table_1 
WHERE (Id = randomNumber) OR (ParentId = randomNumber) 
于 2012-08-23T16:33:07.807 に答える
0

関連記事にも書いた通り、これはSQLだけではできませんが、SQLとVBAを組み合わせれば比較的簡単にできます。

目標は、指定さIdれた がそのレコードとそのすべての子を返すことです。Idその結果、行が指定された祖先の直系の子孫である場合に true を返すブール関数だけが必要になります。

あなたのSQLは次のようになります:

SELECT Id, Name, ParentId
FROM Table_1
WHERE IsDescendant(Id, randomNumber);

Access の VBA 関数は次のようになります。

Public Function IsDescendant(id As Integer, relative As Integer) As Boolean
    Dim currentID As Variant
    currentID = id

    Do Until IsNull(currentID)
        If (currentID = relative) Then
            IsDescendant = True
            Exit Function
        End If
        currentID = DLookup("ParentId", "Table_1", "Id=" & currentID)
    Loop
    IsDescendant = False
End Function

パフォーマンスに関しては、私が使用したため、これは最大ではないかもしれませんが、パフォーマンスが大幅に向上する場合は、オブジェクトDLookupを使用することもできます。RecordSetこれは、私が書き留めた最速のコードです。

于 2012-08-23T23:02:29.150 に答える