查询非顺序ID表以更新引用表中的值

时间:2018-06-21 14:52:57

标签: sql sql-server

我需要用写在另一个表Y中的值更新表X中的一列。请注意,由于删除了几行/几行,Id列中存在空白。它以表X中的Id列63450开头,并且并不是真正的顺序,如下所示:

表X

    Id      Name                 Value
-------------------------------------------
    63450   cmd                   NULL 
    63451   Jong                  NULL 
    63456   Xau-Min               NULL 
    63457   bgf                   NULL 
    63458   tcr                   NULL 
    63459   cro                   NULL 
    63500   344453f               NULL 
    63501   stackoverflow         NULL 

表Y(参数化)

Id  Acronym       Code
-------------------------------
1    cmd         545654
2    bgf         454565
3    cro         555555
4    rtg         465456
5    ert         546546
6    tcr         878787

现在更新表X之后,它应该显示如下。它将根据表Y中的匹配项更新表X中的vALUE。

更新后的表X ...

    Id      Name                  Value
-------------------------------------------
    63450   cmd                   545654
    63451   Jong                  NULL 
    63456   Xau-Min               NULL 
    63457   bgf                   454565
    63458   tcr                   878787
    63459   cro                   555555
    63500   344453f               NULL 
    63501   stackoverflow         NULL 

如果我尝试

  USE Database
   DECLARE @counter int
   SET @counter=(select count(*) from table_X)
       WHILE @counter>0
             BEGIN
                  UPDATE table_X
                  SET Value=(select Code                                       
                             from table_Y b inner join table_X a on a.Name=b.Acronym 
                             where a.Id= max(a.Id)-@counter+1)
                  SET @value=@value-1
             END

由于ID不是连续的,它将无法工作...如何实现如图所示的更新表X?

2nd:最好有一个仅检测字母的功能(在表X的Name列中).. SQL中是否有?我只知道检测字符串中的数字值:isnumeric()函数。

谢谢。 :)

1 个答案:

答案 0 :(得分:4)

认为这就是你所追求的:

UPDATE X
SET [Value] = Y.Code
FROM TableX X
     JOIN TableY Y ON X.[name] = Y.Acronym;

这里绝对不需要循环。实际上,在SQL中使用循环结构通常是性能上最糟糕的事情。

就SQL语句而言,这实际上是一个非常简单的查询,所以您了解它的作用吗?