根据字段值更新多个ID

时间:2015-12-16 12:51:41

标签: sql sql-server sql-server-2012

我想查找具有值的所有数据行,例如'N / A'

我想将所有具有相同CommonID​​的数据行更新到NewDataHere列中,因此在下面的示例中,ID 1和2会受到影响

我在存储过程中执行此操作

代码远:

DECLARE @sqlPRatingChange NVARCHAR(MAX)
SET @sqlPRatingChange = 'UPDATE TblAsbestos SET  NewDataHere= ''NA''  
WHERE (SELECT ID FROM TBLASBESTOS WHERE VALUE= ''N/A'')'''
EXEC (@sqlPRatingChange) 

数据库示例,因为它应该照看代码

  • ID-VALUE-NewDataHere

    1-N / A-N / A

    2-C-N / A

    2-N / A-N / A

    1-A-N / A

    3-B - ''

4 个答案:

答案 0 :(得分:2)

为什么使用动态SQL?您的查询似乎足够接近。它只需要一个相关条款:

UPDATE TblAsbestos
    SET  NewDataHere = 'NA'
    WHERE (SELECT ID FROM TBLASBESTOS a2 WHERE VALUE = 'N/A' AND TblAsbestos.id = a2.id);

在SQL Server中,我可能倾向于使用CTE和窗口函数来执行此操作:

with toupdate as (
      select a.*,
             sum(case when value = 'N/A' then 1 else 0 end) over (partition by id) as numNAs
      from TblAsbestos a
     )
update toupdate
    set NewDataHere = 'NA'
    where numNAs > 0;

答案 1 :(得分:2)

这可能是对戈登答案的评论,但它太长了,答案提供的格式有帮助......

错误的语法错误是因为在SQL Server中您不能为更新语句的目标设置别名(不要混淆使用别名作为允许的目标)。 where子句也是不正确的,它似乎是EXISTS子句和IN子句之间的混合,但最终都没有。我想你需要:

UPDATE  TblAsbestos
SET     NewDataHere = 'NA'
WHERE   EXISTS 
        (   SELECT  1 
            FROM    TblAsbestos AS a 
            WHERE   a.Value = 'N/A' 
            AND     a.id = TblAsbestos.id
        );

或者

UPDATE  TblAsbestos
SET     NewDataHere = 'NA'
WHERE   ID IN (SELECT a.ID FROM TblAsbestos AS a WHERE a.Value = 'N/A');

答案 2 :(得分:1)

试试这个。只需将table1替换为您的表名:

update a
set NewDataHere = 'N/A'
from table1 as a
where exists(select 1 from table1 as b where a.id = b.id and b.value = 'N/A')

答案 3 :(得分:0)

试试这个:

更新TblAsbestos a    SET NewDataHere ='NA'  存在的地方(选择前1个ID                  来自TBLASBESTOS a2                 WHERE上(值)='N / A'                   AND a.id = a2.id);