Обновить пустые поля таблицы MS Access на основе той же таблицы

В базе данных MS Access я работаю с таблицей, в которой есть строки. В некоторых случаях не все столбцы строк заполнены. Я хочу создать запрос на обновление, чтобы обновить значения пустых полей данными из других строк, где столбец не пуст.

гуглил вопрос, но удовлетворительного ответа не нашел. Может ли кто-нибудь показать мне, как должен быть построен запрос?

Текущая таблица выглядит так

| Invoicenumber | Customer | Date    |
|---------------|----------|---------|
| 5             | 12       | 12-6-19 |
| 5             |          | 12-6-19 |
| 5             |          | 12-6-19 |
| 5             |          | 12-6-19 |
| 6             | 18       | 15-6-19 |
| 6             |          | 15-6-19 |
| 6             |          | 15-6-19 |
| 7             | 20       | 20-6-19 |
| 7             |          | 20-6-19 |

Мне нужно, чтобы после обновления таблица выглядела так:

| Invoicenumber | Customer | Date    |
|---------------|----------|---------|
| 5             | 12       | 12-6-19 |
| 5             | 12       | 12-6-19 |
| 5             | 12       | 12-6-19 |
| 5             | 12       | 12-6-19 |
| 6             | 18       | 15-6-19 |
| 6             | 18       | 15-6-19 |
| 6             | 18       | 15-6-19 |
| 7             | 20       | 20-6-19 |
| 7             | 20       | 20-6-19 |

person Sunfile    schedule 19.06.2019    source источник
comment
Форматировать данные таблицы. Ваши данные выглядят так, как будто пустые поля представляют собой счета-фактуры, соединенные со счетами-фактурами, и там, где две таблицы счета-фактуры с номером, клиент и счета-фактуры с номером, но не клиент. есть еще колонки?   -  person ComputerVersteher    schedule 19.06.2019
comment
@ComputerVersteher есть еще много столбцов, но они не связаны с проблемой. Я обновлю свой вопрос еще одним столбцом, чтобы он выглядел ближе к реальным данным.   -  person Sunfile    schedule 19.06.2019
comment
Какова цель наличия таблицы с повторяющимися значениями. Ваши данные являются результатом запроса как минимум между двумя таблицами, и должно быть поле, не равное комбинации номера счета-фактуры и клиента.   -  person ComputerVersteher    schedule 19.06.2019
comment
@ComputerVersteher, еще раз извините за неясный пример. Есть намного больше столбцов с данными. В этих столбцах данные различаются в каждой строке для одного и того же номера счета-фактуры, поэтому существуют уникальные строки.   -  person Sunfile    schedule 19.06.2019
comment
Разве вы не хотите иметь исходную структуру данных, Должна быть таблица клиентов, но вопрос в том, в чем вопрос? Означает, что вы хотите сделать с данными? Если вы извлечете таблицы, вы можете создать запрос, который заполняет данные без какого-либо обновления, и любое обновление означает новое повторяющееся значение. Но это было бы несколько преувеличением, если вы просто хотите это напечатать ;)   -  person ComputerVersteher    schedule 19.06.2019
comment
Для этого потребуется VBA, управляющий набором записей. Также нужны некоторые уникальные поля идентификатора, которые могут правильно упорядочивать записи. Это не показано в примерных данных. Структура данных не нормализована. Должны быть таблицы Invoices и InvoiceDetails. CustomerId будет внешним ключом, сохраненным в Invoices, где InvoiceID — это уникальный первичный ключ, а InvoiceID будет сохранен как внешний ключ в InvoiceDetails. Тогда UPDATE не понадобится.   -  person June7    schedule 19.06.2019
comment
@June7, я открыт для идеи использования VBA. Можете ли вы показать мне некоторые зацепки о том, как это сделать? В таблице данных есть уникальное поле идентификатора. Эти данные импортируются из источника данных, который может предоставить только этот формат. Строки, где заполняется клиент, содержат итоговые суммы счетов. Однако в них отсутствуют определенные детали, и они будут удалены из таблицы позже. Перед удалением клиента необходимо скопировать в связанные строки счета. Это то, что есть, в надежде найти правильное решение. С уважением.   -  person Sunfile    schedule 19.06.2019
comment
Упс, отмените мой комментарий. Есть способ сделать это с помощью одного запроса, используя DLookup().   -  person June7    schedule 19.06.2019


Ответы (4)


Вы можете сделать это только с помощью SQL, присоединив таблицу к самой себе:

UPDATE 
    Invoices 
    INNER JOIN Invoices AS Inv2
    ON Invoices.InvoiceNumber = Inv2.InvoiceNumber
SET
    Invoices.Customer = Inv2.Customer
WHERE 
    (Invoices.[Customer] Is Null)
    AND (Inv2.Customer IS NOT NULL)
person John Mo    schedule 19.06.2019
comment
Хорошо, без отдельных или агрегатов запрос остается обновляемым. - person ComputerVersteher; 19.06.2019

Вы можете поместить оператор Switch в обновление, чтобы выбрать значение для обновления на основе состояния поля CUSTOMER.

Update TestTable 
Set CUSTOMER = Switch(CUSTOMER is  Null,OTHER_FIELD,CUSTOMER = '',OTHER_FIELD,CUSTOMER<>'',CUSTOMER)

Этот оператор обновит поле CUSTOMER до OTHER_FIELD, где CUSTOMER пусто или CUSTOMER имеет значение Null. Если CUSTOMER имеет значение, он устанавливает его в это значение (по сути, оставляя его таким же).

Оператор «SWITCH» — это версия «Switch» или «Select Case» в Access в коде, где первый параметр — это условие для проверки, а параметр после него — это значение, которое необходимо принять, если предыдущее условие возвращает значение true. Так...

Switch(1=1,'YES',2=1,'NO', case 3, return 3, case 4, return 4, etc., etc.,) 

вернет «ДА», потому что 1 равно 1.

Был бы более красноречивый способ сделать это с помощью кода, но в запросе Access я не знаю другого способа.

person RunninThruLife    schedule 19.06.2019
comment
@RunningThruLife, спасибо за ответ. Вы имеете в виду код VBA? Потому что это тоже вариант для меня. Можете ли вы показать мне некоторые зацепки о том, как действовать дальше? - person Sunfile; 19.06.2019
comment
Я имел в виду код VBA, но, как я уже сказал, это не необходимо. Код будет зависеть от нескольких вещей. В своем вопросе вы попросили SQL-запрос в Access для его обработки. Если вам нужен код, чтобы сделать то же самое, я думаю, это будет другой вопрос. Решает ли это исходную проблему? - person RunninThruLife; 19.06.2019
comment
Не вижу, как это заполнит поле «Клиент» соответствующим идентификатором клиента. - person June7; 19.06.2019
comment
Июнь, ОП сказал, что он хотел обновить значения в одной строке, где столбец пуст, из другого столбца, где это не так. Переключатель возьмет значение из другого поля, где поле клиента не имеет значения. Я что-то не понимаю в вопросе. - person RunninThruLife; 19.06.2019

Попробуйте использовать агрегатную функцию домена, чтобы получить клиента:

UPDATE table1 SET table1.Customer = DMax("Customer","table1","Invoicenumber=" & [Invoicenumber])
WHERE (((table1.Customer) Is Null));
person June7    schedule 19.06.2019

На вопрос ответило решение, упомянутое @John Mo. Использовал свой код для обновления таблицы данными, доступными в таблице.

person Sunfile    schedule 21.06.2019