web-dev-qa-db-ja.com

MSSQLクエリを使用して親のすべての子を取得する

データベースに次のデータがあります。

Parent      Child
101         102
101         103
101         104
101         105
101         106

私のパラメーターは106です。また、パラメーターを使用して、親である101の下にある他のすべての子を取得したいと考えています。クエリを作成する別の方法はありますか?

8
waine

@p0siblingsを取得したい場合、単純な自己結合を使用できます。

SELECT p.Child
FROM Table1 c
INNER JOIN Table1 p ON c.Parent = p.Parent
WHERE c.Child = @p0
AND p.Child <> @p0

ここでの不等節により、検索した値を含まない兄弟を確実に取得できます。必要に応じて取り外してください。

SQL Fiddle例


ただし、再帰について言及しているので、おそらく@p0の親から始まるツリー全体が必要です。その場合、再帰CTEを使用できます。

WITH parent AS (
    SELECT Parent
    FROM Table1
    WHERE Child = @p0
), tree AS (
    SELECT x.Parent, x.Child
    FROM Table1 x
    INNER JOIN parent ON x.Parent = parent.Parent
    UNION ALL
    SELECT y.Parent, y.Child
    FROM Table1 y
    INNER JOIN tree t ON y.Parent = t.Child
)
SELECT Parent, Child
FROM tree

SQL Fiddle例 データを使用 および 再帰CTEを示す追加データあり

16
lc.

SQL Authorityのブログに、再帰的なCTEを使用して階層クエリを実行する方法の非常に優れた説明があります

http://blog.sqlauthority.com/2012/04/24/sql-server-introduction-to-hierarchical-query-using-a-recursive-cte-a-primer/

よろしく

4
Ricardo Huertas