我有下表test
Id Code ParentId
1 R O
2 Y O
3 P O
4 O NULL
我需要像这样更新test
:
Id Code ParentId
1 R 4
2 Y 4
3 P 4
4 O NULL
我试过了,但它没有用,有什么想法吗?
update [dbo].[test]
set [ParentId] =
CASE WHEN [ParentId]='' THEN [Id]
else select top 1 [Id] from [dbo].[PNL] where ParentId=[Code]
End
我得到了表test updated
Id Code ParentId
1 R NULL
2 Y NULL
3 P NULL
4 O NULL
答案 0 :(得分:1)
直接解决方法是:
- 将子查询放在()
中
- 确保在该子查询中指定[test]
(我不得不猜测ParentID
或[code]
来自[test]
。)
update [dbo].[test]
set [ParentId] =
CASE WHEN [ParentId]='' THEN [Id]
else (select top 1 [Id] from [dbo].[PNL] where ParentId=[test].[Code])
End
答案 1 :(得分:1)
通过更新和删除,首先测试选择通常更安全:
select t1.*,
case when t1.parentid is null then t1.id
else (select top 1 t2.Id from #t t2 where t1.ParentId = t2.Code) end as new_parentid
from #t t1
然后使用CTE进行实际更新:
with x as (
select t1.*,
case when t1.parentid is null then t1.id
else (select top 1 t2.Id from #t t2 where t1.ParentId = t2.Code) end as new_parentid
from #t t1
)
update x
set parentid = new_parentid
答案 2 :(得分:1)
如果我理解正确,要求相当简单:
ParentId
,请不要管它。ParentId
与同一表格中的代码匹配,则使用匹配的行ParentId
更新Id
。在这种情况下,简单的INNER JOIN
更新应该有效:
UPDATE
test
SET
ParentId = PT.Id
FROM
test T
-- The INNER JOIN will automatically discard all rows without ParentId
INNER JOIN
test PT ON
(PT.Code = T.ParentId)