2016-08-15 53 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) 

我不知道如何引用在選擇查詢「當前行正在更新」。

這是甚至正確的方法來實現這一目標嗎?

噢 - 我們還需要適當地識別和處理「空值」(例如「項目1」和「項目2」沒有父項..所以父項ID值應保留其「空值」)

+2

您需要解釋邏輯;你試圖達到的目標並不明確! – techspider

+0

好吧,我已經添加了更多的細節,使其更清晰 –

回答

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