Access 2013 - обновление таблицы данных с различными критериями для каждого столбца - PullRequest
0 голосов
/ 18 января 2019

У меня есть база данных с около 20 столбцами и около 3000 строк, некоторые поля пустые. Эта база данных генерируется автоматически , и информация может измениться.

Пример:

   | Column 1 | Column 2 | Column 3 |   ...    | Column 20 |   
1  |  BBB     |   BBB    |   BBB    |          |    BBB    |
2  |          |   BBB    |   BBB    |   BBB    |    BBB    |
3  |  BBB     |          |          |   BBB    |    BBB    |
4  |  BBB     |   BBB    |   BBB    |   BBB    |           |
5  |  BBB     |   BBB    |          |   BBB    |    BBB    |

Я собираюсь использовать эту для обновления другой существующей таблицы, в которую я должен вручную ввести отсутствующие данные

   | Column 1 | Column 2 | Column 3 |   ...    | Column 20 |   
1  |  BBB     |   BBB    |   BBB    |          |   4444    |
2  |  AAA     |   BBB    |  4444    |   BBB    |   4444    |
3  |  BBB     |   AAA    |   BBB    |   BBB    |    BBB    |
4  | 4444     |   BBB    |   BBB    |   BBB    |           |
5  |  BBB     |   BBB    |   AAA    |   BBB    |    BBB    |

Как видите, у нас есть несколько ситуаций:
1 - Информация в таблице фактических данных и обновлений одинакова (ОК)
2 - информация в обеих таблицах отсутствует (ОК)
3 - Новая информация в таблице обновлений (ОК)
4 - В таблице, которую я собираюсь использовать для обновления информации, все еще есть пустые поля, которые в фактической таблице, которую я уже заполнил.

Дело в том, что я не хочу портить эту информацию, поэтому мне нужно создать запрос на обновление, который не будет перезаписывать информацию пустыми полями. Но мне нужно сделать это с каждым столбцом (столбец 1 обновляет столбец 1, столбец 2 обновляет столбец 2 ...)

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

   | Column 1 | Column 2 | Column 3 |   ...    | Column 20 |   
1  |  BBB     |   BBB    |   BBB    |          |    BBB    |
2  |  AAA     |   BBB    |   BBB    |   BBB    |    BBB    |
3  |  BBB     |   AAA    |   BBB    |   BBB    |    BBB    |
4  |  BBB     |   BBB    |   BBB    |   BBB    |           |
5  |  BBB     |   BBB    |   AAA    |   BBB    |    BBB    |

Спасибо!

Ответы [ 2 ]

0 голосов
/ 31 января 2019

На самом деле вы можете использовать один запрос с условной IIF логикой без какого-либо предложения WHERE:

UPDATE UpdateTable UT 
INNER JOIN ActualTable AT ON AT.Id = UT.Id
SET AT.[Column 1] = IIF(UT.[Column 1] IS NOT NULL, UT.[Column 1], AT.[Column 1]),
    AT.[Column 2] = IIF(UT.[Column 2] IS NOT NULL, UT.[Column 2], AT.[Column 2]),
    AT.[Column 3] = IIF(UT.[Column 3] IS NOT NULL, UT.[Column 3], AT.[Column 3]),
    ...other columns...
;
0 голосов
/ 20 января 2019

Как отметил @ июня7 в своем комментарии, вам нужно создать 20 операторов обновления следующим образом

Update AT SET AT.[ColumnName] = UT.[ColumnName] 
From UpdateTable UT INNER JOIN ActualTable AT
On AT.Id = UT.Id
WHERE UT.[ColumnName] is not NULL

Как видите, 20 операторов будут практически идентичны, за исключением имени столбца. Это позволяет ускорить решение одной из следующих опций

  • Создайте динамический SQL-запрос, которому вы передаете имя столбца из своего кода
  • Скопируйте и вставьте один и тот же запрос 20 раз в текстовый редактор и просто замените имя столбца
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...