【问题标题】:Query for non sequential Id table to update values from a referenced table [duplicate]查询非顺序 Id 表以更新引用表中的值 [重复]
【发布时间】: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


【解决方案1】:

认为这就是你所追求的:

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

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

这实际上是一个非常简单的查询,就SQL语句而言,那么你明白它在做什么吗?

【讨论】:

  • 是的,知道了。谢谢!那么在哪些情况下我们可以使用while循环呢?
  • 一般来说,当你做一些在数据集级别无法实现的事情时。例如,您可能需要通过sp_send_dbmail 发送一些数据派生电子邮件,而不同的收件人需要不同的数据。人们倾向于使用循环/光标的大多数“事情”实际上都可以以数据集的方式完成,并且(通常)更快。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-30
  • 2012-10-11
  • 1970-01-01
  • 2017-07-18
  • 1970-01-01
相关资源
最近更新 更多