【问题标题】:replacing vales in one table with values from another table using multiple criteria使用多个条件将一个表中的值替换为另一个表中的值
【发布时间】:2015-06-18 16:28:37
【问题描述】:

我有两张表,一张名为 accajd,截图如下所示,其中包含旧值和新值。一个叫做 jobcost,有大约 15 个字段,其中 3 个需要使用 accadj 表(accno、jno 和 saccno)中的数据进行更新。我需要做的是工作成本中的任何地方,来自 accno、jno 和 saccno 字段的数据与来自 accadj 的 accnoold、jnoold 和 saccnoold 匹配,我需要用来自 accnonew、jnonew 和的值替换 jobcost 中的数据来自 accadj 的 saccnonew。

update jobcost 
set accno =(SELECT accadj.[accnonew] FROM accadj 
   WHERE accadj.id = jobcost.[jno] 
  AND accadj.[saccnoold] = jobcost.[saccno]),
jno =(SELECT accadj.[accnonew] FROM accadj 
   WHERE accadj.id = jobcost.[jno] 
  AND accadj.[saccnoold] = jobcost.[saccno]),
saccno =(SELECT accadj.[accnonew] FROM accadj 
   WHERE accadj.id = jobcost.[jno] 
  AND accadj.[saccnoold] = jobcost.[saccno])

就为这项任务编写查询而言,这就是我所能想到的,而且离工作还很遥远。 jobcost 表有大约 15,000 个条目,所以这段代码最终只会替换其中的大约 100 个

【问题讨论】:

  • 正如所写的那样,您的代码不会更新任何内容,因为您不能有多个 where 子句,其中的逗号我不太明白。
  • 代码是一个糟糕的尝试来实现它,我在其他页面上看到了内部连接的使用,但我不知道如何使用这些。基本上如果所有 3 列都匹配,则将所有 3 列替换为新值。我完全不知道如何做到这一点,但是当我不输入某种尝试的代码时,我会在这里被骂
  • 更新 jobcost SET accno =(SELECT accadj.[accnonew] FROM accadj WHERE accadj.[jnoold]=jobcost .[jno] AND accadj.[saccnoold] = jobcost.[saccno]);跨度>
  • 我没有 id 列。没有一列包含所有唯一信息,这就是为什么它们必须在多个字段上匹配
  • 尝试在你的代码中实现上面的代码可能行得通

标签: sql-server database sql-update inner-join


【解决方案1】:

检查下面的代码它肯定会工作,

Update jc
set jc.accno = ac.accnonew,jc.jno =ac.accnonew,jc.saccno =ac.saccnonew
from jobcost jc join accadj ac with(nolock)
on jc.accno  = ac.accnoold
and jc.jno  = ac.jnoold
and jc.saccno =ac.saccnoold

谢谢

【讨论】:

  • 我猜我应该用 jobcost 替换所有 jc,用 accadj 替换所有 ac?
  • 为什么?它将与别名一起使用。别名有什么问题吗..?
  • 为什么要在这里使用 nolock?你知道这个提示带来了什么吗? blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere
  • 我认为它是静态表..这是我的错误..感谢您睁开眼睛...信息可能会在两者之间更新...什么是更好的选择 readpast,readcommited tabblock还是没有提示?如果我们使用 readcommited ,readpast ,那么所有行都可能不会在单次运行中更新。它不是确定性的..另一方面,如果我们使用 tablock 或没有提示,它可能会争取锁定..
  • 我不知道 no lock 做了什么,但是是的,每次我需要运行这个程序时,表都会发生变化
猜你喜欢
  • 2021-01-01
  • 2019-11-07
  • 2023-01-19
  • 2013-10-08
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-10
相关资源
最近更新 更多