Обновление таблицы с 2 циклами - PullRequest
1 голос
/ 01 февраля 2020

Мне нужно обновить 'End_A' в таблице TSW. (SQL Server 2016)

  1. Внешний l oop -> Выбрать Start_a, C_ID из группы dbo.tsw по типу C, упорядочить по start_A des c.

    Во внешнем l oop я выбираю первый набор записей Start_A (не нуль)

  2. Inner l oop -> Выберите Up_Date из dbo. tsw сгруппировать по типу C, где CA = «что угодно» и (update> Start_A) сгруппировать по типу C, упорядочить по Up_Date des c.

    Во внутреннем l oop Я ищу соответствующий набор записей (группа по типу C), чтобы обновить End_A. Это следующий набор записей Up_Date> Start_a с условием ...

  3. Выберите c_ID из внешнего lopp и обновите End_A с Up_date из внутреннего цикла Обновите End_A с выбранной Up_Date из внутреннего l oop .

  4. Выберите следующий соответствующий набор записей (группа по типу C), чтобы обновить End_A, до конца группы по типу C.

  5. Выберите следующий набор записей из внешнего l oop, затем шаг 2 ....

Всегда группировать по типу C. Тип C - это «блок» для обновления нескольких 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 -> от следующего типа C '123', где CA <> 'AA' (C_ID = 19)
  2. C_ID 19 -> от следующего типа C '123', где CA < > 'BB' (C_ID = 15)
  3. C_ID 10 -> от следующего типа C '456', где CA <> 'BB' (C_ID = 110)
  4. C_ID 8 - -> от следующего типа C '123', где CA <> 'BB' (C_ID = 15)
  5. C_ID 7 -> от следующего типа C '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 таблицу с этой выбранной информацией во внутреннем l oop? Заранее спасибо.

NEw Table

...