sql - 在 SQL Server 中高效更新
问题描述
我正在寻找一种在 SQL Server 中更新数据的有效方法,id-B,id-C, and other
如果状态来自id-A
is 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 |
如何构建结果?
谢谢
解决方案
使用可更新的 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
恰好是的计数A
。Id
然后,我们对所有计数大于零的记录的状态进行更新。