2016-08-15 54 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