首页 > 解决方案 > 用 2 个循环更新表

问题描述

我必须更新表 TSW 中的“End_A”。(SQL Server 2016)

  1. 外循环 --> 选择 Start_a, C_ID from dbo.tsw group by TypeC order by start_A desc。

    在外循环中,我选择第一个记录集 Start_A(不为空)

  2. 内部循环 --> 从 dbo.tsw 组中选择 Up_Date,其中 CA = 'whatever' 和 (update > Start_A) group by TypeC order by Up_Date desc。

    在内部循环中,我搜索相应的记录集(按 TypeC 分组)以更新 End_A。它是下一个记录集 Up_Date > Start_a,条件为 ...

  3. 从外部 lopp 中选择 c_ID 并使用内部循环中的 Up_date 更新 End_A 使用内部循环中选择的 Up_Date 更新 End_A。

  4. 选择下一个对应的记录集(按TypeC分组)更新End_A,直到按TypeC分组结束。

  5. 从外循环中选择下一个记录集,然后步骤 2....

始终按 TypeC 分组。TypeC 是更新多个 End_A 的“块”。

这是更新前的表格(示例):

C_ID|TypeC| CA  |   Up_Date         |   Start_A | End_A |
----------------------------------------------------------------
14  |123  | AA  |2019-01-05 02:15:00|2019-01-03 |      |
24  |678  | AA  |2019-02-05 08:00:05|           |      |
12  |123  | AA  |2019-01-07 03:27:12|           |      |
19  |123  | BB  |2019-03-05         |2019-05-17 |      |
10  |456  | BB  |2019-11-05         |2019-10-01 |      |
23  |123  | BB  |2019-07-05         |           |      |
8   |123  | BB  |2019-01-05         |2019-02-01 |      |
7   |678  | BB  |2019-01-05         |2020-08-09 |      |
1   |678  | BB  |2019-01-05         |           |      |
2   |678  | CC  |2020-09-05         |2019-10-14 |      |
29  |678  | AA  |2020-01-05         |2020-01-05 |      |
15  |123  | CC  |2019-06-05         |           |      |
17  |678  | CC  |2022-01-05         |           |      |
55  |123  | CC  |2019-09-05         |           |      |
77  |678  | CC  |2019-01-05         |           |      |
47  |678  | AA  |2019-01-05         |           |      |
110 |456  | BC  |2019-11-05         |           |      |
    Start Loop_1
    select TSW.Start where start_A is not null 
    from TSW
    group by TypeC

      Start Loop_2 --(Up_Date next emyty End_A with 'Up_Date')
          Update TSW.End_a = Loop_2_End_A
          select Up_Date
          from
          where TSW.Start_A is not null 
              and "Loop_1 TypeC" = "Loop_2 TypeC"
              and CA = "blabla" as Loop_2_End_A
              order by up_date
          group by TypeC

          then select next relevant Up_Date from Loop_2
      end loop2

    select next from Loop_1
    end loop_1 
  1. C_ID 14--> 来自下一个 TypeC '123' 其中 CA <> 'AA'(C_ID = 19)
  2. C_ID 19 --> 来自下一个 TypeC '123' 其中 CA <> 'BB'(C_ID = 15)
  3. C_ID 10 --> 来自下一个 TypeC '456' 其中 CA <> 'BB'(C_ID =110)
  4. C_ID 8 --> 来自下一个 TypeC '123' 其中 CA <> 'BB'(C_ID = 15)
  5. C_ID 7 --> 来自下一个 TypeC '678' 其中 CA <> 'BB'(C_ID = 17)

这是更新后的表格:

C_ID|TypeC| CA  |   Up_Date         |   Start_A | End_A    |
--------------------------------------------------------------------
14  |123  | AA  |2019-01-05 02:15:00|2019-01-03 |2019-03-05|
24  |678  | AA  |2019-02-05 08:00:05|           |          |
12  |123  | AA  |2019-01-07 03:27:12|           |          |
19  |123  | BB  |2019-03-05         |2019-05-17 |2019-06-05|
10  |456  | BB  |2019-11-05         |2019-10-01 |2019-11-05|
23  |123  | BB  |2019-07-05         |           |          |
8   |123  | XX  |2019-01-05         |2019-02-01 |2019-06-05|
7   |678  | BB  |2019-01-05         |2020-08-09 |2020-09-05|
1   |678  | BB  |2019-01-05         |           |          |
2   |678  | CC  |2020-09-05         |2019-10-14 |2021-05-01|
29  |678  | AA  |2020-01-05         |2020-01-05 |2022-01-05|
15  |123  | CC  |2019-06-05         |           |          |
17  |678  | CC  |2022-01-05         |           |          |
55  |123  | CC  |2019-09-05         |           |          |
77  |678  | CC  |2019-01-05         |           |          |
47  |678  | AA  |2019-01-05         |           |          |
110 |456  | BC  |2019-11-05         |           |          |

如何在 SQL 中使用内部循环中的这些选定信息更新表?提前致谢。

新表

标签: sqlloopssubquerysql-server-2016

解决方案


推荐阅读