[解決済み] 再帰的自己結合の最も簡単な方法とは?
2022-09-15 03:51:39
質問
SQL Server で再帰的自己接合を行う最も簡単な方法は何ですか?私はこのようなテーブルを持っています。
PersonID | Initials | ParentID
1 CJ NULL
2 EB 1
3 MB 1
4 SW 2
5 YT NULL
6 IS 5
そして、特定の人物から始まる階層に関連するレコードのみを取得できるようにしたいのです。ですから、もし私がCJの階層をPersonID=1でリクエストした場合、私は以下を得るでしょう。
PersonID | Initials | ParentID
1 CJ NULL
2 EB 1
3 MB 1
4 SW 2
そしてEBの方には
PersonID | Initials | ParentID
2 EB 1
4 SW 2
私はこれに少し行き詰っています。多くの結合に基づく固定深度の応答とは別に、これを行う方法を考えることができません。私たちは多くのレベルを持たないので、これはそのまま行うことができますが、私はそれを適切に行いたいと思います。
ありがとうございます。クリスです。
どのように解決するのですか?
WITH q AS
(
SELECT *
FROM mytable
WHERE ParentID IS NULL -- this condition defines the ultimate ancestors in your chain, change it as appropriate
UNION ALL
SELECT m.*
FROM mytable m
JOIN q
ON m.parentID = q.PersonID
)
SELECT *
FROM q
順序付け条件を追加することで、木の順序を保持することができます。
WITH q AS
(
SELECT m.*, CAST(ROW_NUMBER() OVER (ORDER BY m.PersonId) AS VARCHAR(MAX)) COLLATE Latin1_General_BIN AS bc
FROM mytable m
WHERE ParentID IS NULL
UNION ALL
SELECT m.*, q.bc + '.' + CAST(ROW_NUMBER() OVER (PARTITION BY m.ParentID ORDER BY m.PersonID) AS VARCHAR(MAX)) COLLATE Latin1_General_BIN
FROM mytable m
JOIN q
ON m.parentID = q.PersonID
)
SELECT *
FROM q
ORDER BY
bc
を変更することで
ORDER BY
の条件を変更することで、兄弟の順序を変更することができます。
関連
-
[解決済み] PostgreSQLのCREATE DATABASE IF NOT EXISTSをシミュレートしてみませんか?
-
[解決済み] SQL Server の DateTime データ型から日付だけを返す方法
-
[解決済み] SQL ServerにおけるLEFT JOINとLEFT OUTER JOINの比較
-
[解決済み] SQL ServerでJOINを使用してUPDATE文を実行するにはどうすればよいですか?
-
[解決済み] SQL Server - 挿入された行のIDを取得するための最良の方法は?
-
[解決済み] JOINとINNER JOINの違いについて
-
[解決済み] INNER JOINよりもCROSS APPLYを使用すべきなのはどのような場合ですか?
-
[解決済み] SQLでランダムな行を要求する方法は?
-
[解決済み】「INNER JOIN」と「OUTER JOIN」の違いは何ですか?
-
[解決済み] SQL ServerでINNER JOINを使用して削除するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
plsql-stored-procedure ORA-06550 エラー処理
-
MHAの高可用性構成とフェイルオーバー
-
[解決済み] SQL Server FOR EACH ループ
-
[解決済み] SQLのSELECTでIF...THENを実行するにはどうすればよいですか?
-
[解決済み] 各グループの最後のレコードを取得する - MySQL
-
[解決済み] SQLのIN句をパラメータ化する
-
[解決済み] 各グループの上位1行を取得
-
[解決済み] SQL ServerでINSERT INTOとしてデータをエクスポートする
-
[解決済み] SQLサーバーで行を列に効率的に変換する
-
[解決済み] 別のテーブルに一致する項目がない行を選択するにはどうすればよいですか?