Sql 查询非顺序Id表以更新引用表中的值
我需要用写在另一个表Y中的值更新表X中的一列。请注意,由于删除了多行/某些行,Id列中存在间隙。它以表X中的Id列63450开始,实际上它不是按顺序排列的,如下所示: 表十Sql 查询非顺序Id表以更新引用表中的值,sql,sql-server,Sql,Sql Server,我需要用写在另一个表Y中的值更新表X中的一列。请注意,由于删除了多行/某些行,Id列中存在间隙。它以表X中的Id列63450开始,实际上它不是按顺序排列的,如下所示: 表十 Id Name Value ------------------------------------------- 63450 cmd NULL 63451 Jong NULL
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
发送一些数据派生的电子邮件,不同的收件人需要不同的数据。人们倾向于使用循环/游标的大多数“事情”实际上可以以数据集的方式完成,并且(通常)更快。