首页 > 解决方案 > 在 SQL Server 中高效更新

问题描述

我正在寻找一种在 SQL Server 中更新数据的有效方法,id-B,id-C, and other如果状态来自id-Ais A,我想更新数据,我不知道这个条件的 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     |

如何构建结果?
谢谢

标签: sqlsql-servertsqlsql-server-2012

解决方案


使用可更新的 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;

演示

这里的策略是为每组Id记录计算Id结束时间-A以及Status恰好是的计数AId然后,我们对所有计数大于零的记录的状态进行更新。


推荐阅读