【发布时间】:2018-11-30 23:10:05
【问题描述】:
我需要使用写入另一个表 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 中的值...
更新后的表 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() 函数。
谢谢。 :)
【问题讨论】:
-
我不明白。从您发布的内容来看,循环和解析字符串毫无意义。为什么不简单地在名称和首字母缩写列上连接这两个表?
-
你是对的。我陷入了使用while循环的陷阱,一个简单的join就做到了。谢谢肖恩和拉努。
-
使用:where X.[Name] like '%[^0-9]%' 排除非数字
-
%[^0-9]%' 在 sql server 中不起作用恐怕是我想要的。我已经测试了您的建议,它还提供带有数字的字符串。我只想有没有任何数字的字母。该正则表达式至少在我用于 sql server 的版本中不起作用。
标签: sql sql-server