使用大小写时更新表

时间:2014-04-24 10:50:31

标签: sql sql-server

我有下表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

3 个答案:

答案 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)