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

Sql 查询非顺序Id表以更新引用表中的值,sql,sql-server,Sql,Sql Server,我需要用写在另一个表Y中的值更新表X中的一列。请注意,由于删除了多行/某些行,Id列中存在间隙。它以表X中的Id列63450开始,实际上它不是按顺序排列的,如下所示: 表十 Id Name Value ------------------------------------------- 63450 cmd NULL 63451 Jong NULL

我需要用写在另一个表Y中的值更新表X中的一列。请注意,由于删除了多行/某些行,Id列中存在间隙。它以表X中的Id列63450开始,实际上它不是按顺序排列的,如下所示:

表十

    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(参数化)

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

更新后的表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,如图所示

第二:如果有一个只检测字母(在表X的列名中)的功能就好了。。SQL中是否存在任何错误?我只知道检测字符串中的数值:isnumeric()函数

谢谢。:)

我想这就是你想要的:

UPDATE X
SET [Value] = Y.Code
FROM TableX X
     JOIN TableY Y ON X.[name] = Y.Acronym;
这里绝对不需要循环。事实上,在SQL中使用循环结构通常是性能最差的做法

就SQL语句而言,这实际上是一个非常简单的查询,所以您知道它在做什么吗?

我想这就是您想要的:

UPDATE X
SET [Value] = Y.Code
FROM TableX X
     JOIN TableY Y ON X.[name] = Y.Acronym;
这里绝对不需要循环。事实上,在SQL中使用循环结构通常是性能最差的做法


就SQL语句而言,这实际上是一个非常简单的查询,所以您知道它在做什么吗?

我不明白。从您发布的内容来看,循环和解析字符串毫无意义。为什么不简单地在“名称”和“首字母缩略词”列上连接这两个表呢?你是对的。我陷入了使用while循环的陷阱,一个简单的连接就成功了。谢谢Sean和Larnu。使用:where X.[Name]如“%$0-9]%”排除非数字%[^0-9]%”在sql server中不起作用我担心我想要的是什么。我已经测试了您的建议,它还提供了带有数字的字符串。我只想要没有数字的字母。该正则表达式至少在我用于sql server的版本中不起作用。我不明白。从您发布的内容来看,循环和解析字符串毫无意义。为什么不简单地在“名称”和“首字母缩略词”列上连接这两个表呢?你是对的。我陷入了使用while循环的陷阱,一个简单的连接就成功了。谢谢Sean和Larnu。使用:where X.[Name]如“%$0-9]%”排除非数字%[^0-9]%”在sql server中不起作用我担心我想要的是什么。我已经测试了您的建议,它还提供了带有数字的字符串。我只想要没有数字的字母。该正则表达式至少在我用于sql server的版本中不起作用。是的,明白了。非常感谢。在什么情况下,我们可以使用while循环呢?通常,当你在做一些在数据集级别无法实现的事情时。例如,您可能需要通过
sp\u send\u dbmail
发送一些数据派生的电子邮件,不同的收件人需要不同的数据。大多数人们倾向于使用循环/游标的“事情”实际上可以用数据集的方式完成,而且(通常)更快。是的,明白了。非常感谢。在什么情况下,我们可以使用while循环呢?通常,当你在做一些在数据集级别无法实现的事情时。例如,您可能需要通过
sp\u send\u dbmail
发送一些数据派生的电子邮件,不同的收件人需要不同的数据。人们倾向于使用循环/游标的大多数“事情”实际上可以以数据集的方式完成,并且(通常)更快。