在 SQL 服务器中高效更新
Efficient to Update in SQL Server
我正在寻找一种有效的方法来更新 SQL 服务器中的数据,如果来自 id-A
的状态是 A
,我想更新数据 id-B,id-C, and other
,我不知道这个条件的更新语句。
我需要处理很多记录。
这是我的例子:
-------------------------------
| 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
个计数大于零的记录的状态。
我正在寻找一种有效的方法来更新 SQL 服务器中的数据,如果来自 id-A
的状态是 A
,我想更新数据 id-B,id-C, and other
,我不知道这个条件的更新语句。
我需要处理很多记录。
这是我的例子:
-------------------------------
| 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
个计数大于零的记录的状态。