隣接モデルのノードをコピーする SQL ストアド プロシージャ (Sql Server 2008 - T-SQL) を作成する必要があります。
テーブルには、Id と ParentId (FK から Id) の 2 つの列があると見なすことができます。コピーとは、すべての部下もコピーする必要があることを意味します。
WITH を使用するのは良いスタートだと思いますが、Cursors を使用せずにこのコピーを実行できるかどうかに興味があります。
隣接モデルのノードをコピーする SQL ストアド プロシージャ (Sql Server 2008 - T-SQL) を作成する必要があります。
テーブルには、Id と ParentId (FK から Id) の 2 つの列があると見なすことができます。コピーとは、すべての部下もコピーする必要があることを意味します。
WITH を使用するのは良いスタートだと思いますが、Cursors を使用せずにこのコピーを実行できるかどうかに興味があります。
隣接リストの根本的な問題は、SQL でサブツリー全体を抽出する一般的な方法がないことです。そのため、カーソルを使用せずに複製する必要があるすべての行を特定するという問題がすでに発生しています。
可能であれば、サブツリーのすべてのノードを簡単に識別できるネストされたセット モデルに隣接リストを移行します。ただし、ネストされたセット モデルのメンテナンスは、一般的な挿入と削除の場合はより複雑です。
編集:「a_horse_with_no_name」で指摘されているように、一般的な SQL では、隣接リスト、再帰的な共通テーブル式を処理する方法があります。
サブツリー全体をコピーするのは少し問題があります。サブツリーをコピーすると、
どちらの場合も、ある時点で一貫性のない状態を介してデータをドラッグしています。これは、設計に問題があることを示しています (たとえば、レコードに複数の親が必要かどうかなど)。そうであれば、再設計を検討する必要があります。
したがって、あなたがやろうとしていることのより完全な例で答えを更新する必要があります。
1 つの解決策は、一時テーブルを用意することです。挿入を選択することは問題ではありません。問題になる参照 ID を更新するだけです。
そう
最初の WITH INSERT で ID (レコード ID と親を参照する ID の両方) を変更するのは難しいため、手順はこのようにする必要があります。ただし、max_id のみまたは古い ID のみに依存する便利な関数があれば、可能かもしれません。