2016-08-15 23 views
0

これは私を少し困らせました。私はSQLの教祖ではありませんので、私に同行してください。同じテーブルへのクエリに基づいてテーブルの列を更新します

私は、各行が(階層を形成するために)「親」を持つことができるテーブルを持っています。例えば「アイテム1.1」はその親として「アイテム1」を有する。

ID列が変更されています(この例では、英数字から自動増分番号に変更されています)。

新しい「ParentId」フィールドには、既存の列データから正しい「親」を作成する方法を教えてください。次のように

私は(非常に単純化された)テーブルを持っている:私が何をしようとしています何

ExampleTable 
============= 
OldId OldParentId Title  NewId NewParentId 
----------------------------------------------------- 
A  Null   Item 1  1  Null 
B  A   Item 1.1  2  Null 
C  A   Item 1.2  3  Null 
D  Null   Item 2  4  Null 
E  D   Item 2.1  5  Null 

は、既存のテーブルに対して検索をもとに、「NewParentId」フィールドに移入されます。

マイ(明確に動作していない)の擬似コードは次のとおりです。

Update ExampleTable 
Set NewParentId = (Select Top 1 NewId From ExampleTable WHERE OldId = ???.OldParentId) 

私は選択クエリで「現在の行が更新され、」参照する方法を知りません。

これを達成するための正しいアプローチですか?

ああ、「nulls」を適切に識別して処理する必要があります(たとえば、「項目1」および「項目2」には親がないため、親ID値は「NULL」値を保持する必要があります)

+2

ロジックを説明する必要があります。あなたが達成しようとしていることは明らかではありません! – techspider

+0

[OK]を、私はそれをより明確にするためにもう少し詳細を追加しました –

答えて

2

あなたは好きなことを行うことができます。

update T 
set NewParentId = T1.NewId 
from ExampleTable as T 
    outer apply (select top 1 T1.NewId 
       from ExampleTable as T1 
       where T1.OldId = T.OldParentId) as T1 
+0

ブリリアント!トリックはうまくいくのですか?ありがとうございました –

+0

一貫性を確保するために、トップ1に注文を追加する必要があります。サンプルデータでは、これは問題ではありませんが、実際のデータでは問題ありません。 OPがソート順を決定できると確信しています。 –

1

をあなたは次のようにOldParentId = OldIdとアップデートを使用して自分自身にあなたのテーブルに参加することができます。

UPDATE A 
SET A.NewParentId = B.NewId 
FROM ExampleTable AS A 
INNER JOIN ExampleTable AS B ON A.OldParentId = B.OldId 

Full working example

関連する問題