3

次のような列を持つテーブルがあります

entityID, entityName, parentID

次のようなものを返すように、エンティティのすべてのレベルの親を返すクエリを作成するにはどうすればよいですか?

childentityname, parentlevel1name, parentlevel2name, parentLevel3name and so on

私は決してSQL忍者ではありません。これは可能ですか?もしそうなら、どのように?

Microsoft SQLServerDBを使用しています。

4

3 に答える 3

3

再帰CTEは、ここで確認する必要があるものです(編集:SQL SERVER 2005以降のみ)

次のようなもの:

WITH recurse_cte (entityID,entityName, parentID, Level)
AS
(
-- Anchor member definition
    SELECT e.entityID,e.entityName, e.parentID,
        0 AS Level
    FROM self_joined AS e
        UNION ALL
-- Recursive member definition
    SELECT e.entityID,e.entityName, e.parentID,
        Level + 1
     FROM self_joined AS e
    INNER JOIN recurse_cte AS cte
        ON e.entityID = cte.parentID
)

select * from recurse_cte
于 2011-06-15T21:34:07.373 に答える
0
SELECT 
  'accounts'.'id' AS id_0,
  'accounts'.'child_id' AS child_id_0, 
  'child_accounts_1'.'id' AS id_1, 
  'child_accounts_1'.'child_id' AS child_id_1, 
  'child_accounts_2'.'id' AS id_2, 
  'child_accounts_2'.'child_id' AS child_id_2, 
  'child_accounts_3'.'id' AS id_3, 
  'child_accounts_3'.'child_id' AS child_id_3, 
  'child_accounts_4'.'id' AS id_4, 
  'child_accounts_4'.'child_id' AS child_id_4
FROM 
  'accounts' 
LEFT OUTER JOIN 'accounts' 'child_accounts_1'
  ON 'child_accounts_1'.'id' = 'accounts'.'child_id'
LEFT OUTER JOIN 'accounts' 'child_accounts_2'
  ON 'child_accounts_2'.'id' = 'child_accounts_1'.'child_id'
LEFT OUTER JOIN 'accounts' 'child_accounts_3'
  ON 'child_accounts_3'.'id' = 'child_accounts_2'.'child_id'
LEFT OUTER JOIN 'accounts' 'child_accounts_4'
  ON 'child_accounts_4'.'id' = 'child_accounts_3'.'child_id'
WHERE 'accounts'.'id' = 56

これは、私のものが子の階層であることを除いて、あなたがしていることと非常に似ています。

accountsテーブルには、それ自体を参照する属性がnegative_overflow_account_idあります。これにより、ネストの最初の5つのレイヤーの「id」と「negative_overflow_id」が取得されます。

コードに、定数MAX_OVERFLOWに基づいてこのクエリを生成するループを記述しました。このループは、「5」に設定するとこれを生成し、別の数値を使用すると多かれ少なかれ実行されます。

基本的に、私の使用例は、誰かが無限に循環するループを設定していないことを確認することでした。そのため、レベル5に達すると、ユーザーにエラーが発生し、それほど深く設定できないことを通知します。また、いずれかのレベルが最上位レベルまたは前のレベルの1つを参照している場合は、循環再帰を示すエラーも生成されます(永続化が許可されている場合、後でアプリがクラッシュします)。

編集:私は名前を短くしました。誰もそのばかげたテーブルのための私の愚かなばかげた命名規則を見たくありません;)

于 2011-06-15T21:37:08.923 に答える
0

postgresでは、これがまさにそのWITH RECURSIVE目的です。おそらく、(ここにリンクされている)ドキュメントから列名を変更する以上のことをする必要はありません。

OPのDBが再帰をサポートしているかどうかはわかりませんが、おそらくバージョン番号によって異なります。利用可能な場合、構文は類似または同一になります。そうでなければ、それは大きな迷惑です。特にレベルの数に制限がない場合、純粋なSQLソリューションを作成することは非常に困難です。

于 2011-06-15T21:29:32.660 に答える