Sql Server итеративный выбор / обновление - PullRequest
0 голосов
/ 16 августа 2011

У меня есть стол с хранилищем.Есть 20 столбцов для «количества», которое может быть ноль или больше (не может быть ноль).

IDCity | Amount0 | Amount1 | ... Amount19
---------------------------------------------------
ABC    |      25 |       7 | ...
...          ...       ...   ...
XYZ    |      10 |       6 | ...

И таблица для потребления и производства.Есть 20 столбцов для ввода «количество» и 20 столбцов для «количество» выходных.Столбец «OrderNumber» имеет значения от 1 до «N».Значения являются непрерывными.

IDCity | OrderNumber | InAmount0 | InAmount1 | OutAmount0 | OutAmount1 | ...
----------------------------------------------------------------------------
ABC    |           1 |         0 |         0 |         10 |          0 | ...
ABC    |           2 |        30 |         0 |          0 |         16 | ...
ABC    |           3 |         0 |        14 |          7 |          0 | ...
...
XYZ    |           1 |         0 |         9 |         21 |          0 | ...
XYZ    |           2 |         9 |         0 |          0 |         19 | ...
XYZ    |           3 |         2 |         0 |          0 |          4 | ...
...

Мне нужно перебрать строки в «Потребление и производство» и обновить суммы в хранилище в каждом городе.Я хочу уменьшить значения на столбцы "InAmount" и увеличить значения на столбцы "OutAmount".

Однако, если InAmount1 < Amount1 OR InAmount2 < Amount2 OR ... строка должна быть проигнорирована.

Результаты из выборки должны быть:

IDCity | Amount0 | Amount1 | ... Amount19
---------------------------------------------------
ABC    |      12 |       9 | ...
...          ...       ...   ...
XYZ    |       1 |      25 | ...

Строка "XYZ - 1" игнорируется, поскольку InAmount1 = 9 AND Amount1 = 6 => вход больше, чем память.

Строка "XYZ - 3" игнорируется, поскольку InAmount0 = 2 И Amount0 = 10 - 9 = 1 => вход больше, чем хранилище.

Мне нужны быстрые результаты, но я могу выделить много памяти.Среднее количество строк в таблице хранения составит ~ 10K, а в таблице потребления и производства - ~ 25K.

Я думаю, CTE будет правильным решением, но я не смог сделать это правильно.

РЕДАКТИРОВАТЬ: Исходные данные могут быть доступны в виде значения ключа:

Таблица хранения:

IDCity | Kind | Amount
ABC    |    0 |     25
ABC    |    1 |      7
...
XYZ    |    0 |     10
XYZ    |    1 |     6

Таблица потребления и производства:

IDCity | OrderNumber | InKind1 | InAmount1 | InKind2 | InAmount2 | OutKind | OutAmount
ABC    |           1 |    NULL |      NULL |    NULL |      NULL |       0 |        10
ABC    |           2 |       0 |        30 |    NULL |      NULL |       1 |        16
ABC    |           3 |       1 |        14 |    NULL |      NULL |       0 |         7
...
...