【问题标题】:Efficient to Update in SQL Server在 SQL Server 中高效更新
【发布时间】:2021-07-20 14:40:00
【问题描述】:

我正在寻找一种在 SQL Server 中更新数据的有效方法,如果来自 id-A 的状态为 A,我想更新数据 id-B,id-C, and other,我不知道此条件的 UPDATE 语句。 我需要处理很多记录。

这是我的例子:

   -------------------------------
   | Id     | Status|
   -------------------------------
   | 00001-A| A     |
   | 00001-B| I     |
   | 00001-C| I     |
   | 00002-A| A     |
   | 00002-B| I     |
   | 00003-A| I     |
   | 00003-C| I     |
   | 00004-A| I     |
   | 00005-A| A     |
   | 00005-D| I     |
   -------------------------------

这就是我想要的结果:

-------------------------------
   | Id     | Status|
   -------------------------------
   | 00001-A| A     |
   | 00001-B| A     |
   | 00001-C| A     |
   | 00002-A| A     |
   | 00002-B| A     |
   | 00003-A| I     |
   | 00003-C| I     |
   | 00004-A| I     |
   | 00005-A| A     |
   | 00005-D| A     |

如何构建结果?
谢谢

【问题讨论】:

  • 如果您的id 列被分成两列,一列用于整数部分,一列用于字符部分,这将更加直接。
  • 根据问题指南,请展示您的尝试并告诉我们您发现了什么(在本网站或其他地方)以及为什么它不能满足您的需求。
  • 我知道,但是我只是继续其他人的项目,他们的数据ID是这样的,并且数据行已经达到了数百万

标签: sql sql-server tsql sql-server-2012


【解决方案1】:

使用可更新的 CTE:

WITH cte AS (
    SELECT *, COUNT(CASE WHEN RIGHT(id, 1) = 'A' AND Status = 'A' THEN 1 END) OVER
                  (PARTITION BY (SUBSTRING(id, 1, CHARINDEX('-', id) - 1))) cnt
    FROM yourTable
)

UPDATE cte
SET Status = 'A'
WHERE cnt > 0;

Demo

这里的策略是为每组Id 记录计算Id 何时以-A 结尾以及Status 恰好是A 的计数。然后,我们会更新此计数大于零的所有 Id 记录的状态。

【讨论】:

    猜你喜欢
    • 2010-10-12
    • 1970-01-01
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2014-08-02
    • 2014-10-17
    相关资源
    最近更新 更多