gpt4 book ai didi

sql - MS SQL 更新具有多个条件的表

转载 作者:行者123 更新时间:2023-12-03 03:29:34 35 4
gpt4 key购买 nike

阅读此网站寻找答案已经有一段时间了,现在问我的第一个问题!

我正在使用 SQL Server

我有两个表,ABCABC_Temp

内容先插入到 ABC_Temp 中,然后再进入 ABC。表 ABCABC_Temp 具有相同的列,但 ABC_Temp 有一个名为 LastUpdatedDate 的额外列,其中包含上次更新的日期。由于 ABC_Temp 可以有 1 条以上的相同记录,因此它具有由项目编号和上次更新日期组成的复合键。

这些列是:ItemNo |价格| Qty 和 ABC_Temp 有一个额外的列:LastUpdatedDate

我想创建一个满足以下条件的语句:

  1. 检查具有相同键的记录的 ABC 的每个属性是否与 ABC_Temp 的值不同,如果是,则进行更新(即使只有一个属性)不同,所有其他属性也可以更新)
  2. 只更新那些需要更改的,如果记录相同,则不会更新。
  3. 由于 ABC_Temp 中的一项可以有多个记录,因此我只想将最新更新的记录更新为 ABC

我目前使用的是 2005(我想,现在不在工作中)。

这将位于存储过程中,并在 VBscript 计划任务内调用。所以我相信这是一次性的事情。另外,我并没有尝试同步这两个表,因为 ABC_Temp 的内容仅包含通过 BCP 从文本文件批量插入的新记录。为了上下文的缘故,这将与检查记录是否存在的插入存储过程结合使用。

最佳答案

UPDATE
ABC
SET
price = T1.price,
qty = T1.qty
FROM
ABC
INNER JOIN ABC_Temp T1 ON
T1.item_no = ABC.item_no
LEFT OUTER JOIN ABC_Temp T2 ON
T2.item_no = T1.item_no AND
T2.last_updated_date > T1.last_updated_date
WHERE
T2.item_no IS NULL AND
(
T1.price <> ABC.price OR
T1.qty <> ABC.qty
)

如果 priceqty 列中可能存在 NULL 值,那么您需要考虑到这一点。在这种情况下,我可能会将不等式语句更改为如下所示:

COALESCE(T1.price, -1) <> COALESCE(ABC.price, -1)

这假设 -1 不是数据中的有效值,因此您不必担心它实际出现在那里。

此外,ABC_Temp 真的是一个临时表,它加载的时间足够长以将值放入 ABC 中吗?如果没有,那么您将在多个位置存储重复的数据,这是一个坏主意。第一个问题是现在你需要这些类型的更新场景。您可能会遇到其他问题,例如数据不一致等。

关于sql - MS SQL 更新具有多个条件的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6455277/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com