MS Access - SQL Inner Join с двумя условиями и Len-функцией - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть база данных с таблицей, которую я использую в качестве главной, и которая ежедневно обновляется и дополняется таблицей с такой же компоновкой.Прежде чем я обновлю почти весь мастер ежедневными данными, я хочу проверить, изменились ли значения из определенного столбца во время ежедневного обновления.Обычно этот столбец содержит только Null или «X».

В качестве прототипа я сравнил только конкретный столбец таблицы A и таблицы B и, если есть разница, задайте значение с более чем одним символом в столбце (здесь вчерашняя дата).

Это код, который работал в качестве прототипа:

UPDATE ReiseMaster
INNER JOIN Update_Import
ON(ReiseMaster.Col3 <> Update_Import.Col3 
SET ReiseMaster.Col3  = Date() - 1

Теперь столбец содержит значение Null, "X" или дату в мастере.Для следующего обновления я теперь должен убедиться, что значения этого ранее обновленного столбца, содержащие дату в виде строки, будут исключены (в противном случае ReiseMaster.Col3 <> Update_Import.Col3 всегда будет верным для них в будущем, и дата будетвсегда обновляться, что не должно происходить).

Мой подход состоял в том, чтобы исключить все наборы данных из основной таблицы, где длина значений в столбце превышает 1.

Теперь здесьмоя проблема:

При запуске кода SQL MS Access больше не отвечает , происходит сбой всей программы.Может кто-нибудь посоветовать мне, что может быть не так со следующим кодом?

UPDATE ReiseMaster
INNER JOIN ReiseMaster_Import
ON(ReiseMaster.`Attachment Indicator` <> ReiseMaster_Import.`Attachment Indicator` AND LEN(ReiseMaster.`Attachment Indicator`) <= 1)
SET ReiseMaster.`Attachment Indicator`  = Date() - 1

Дополнительная информация: Я использую Access VBA для запуска кода, и во время этого также выполняются SQL-операторысохранено в строкеО причине, по которой я добавляю дату, как только я наблюдаю изменение, я хочу использовать даты в качестве справочного, когда значение было изменено впервые, чтобы провести дальнейший анализ с ними на более позднем этапе.

1 Ответ

0 голосов
/ 19 декабря 2018

Избегайте использования сложных объединений в запросах на обновление!Поскольку весь набор записей должен быть обновляемым, Access, как правило, сталкивается с проблемами.

Вместо этого используйте предложение WHERE:

UPDATE ReiseMaster
INNER JOIN ReiseMaster_Import
ON(ReiseMaster.[Attachment Indicator] <> ReiseMaster_Import.[Attachment Indicator])
SET ReiseMaster.[Attachment Indicator]  = Date() - 1
WHERE  LEN(ReiseMaster.[Attachment Indicator]) <= 1

Кроме того, Access использует скобки для выхода из пробелов вимена столбцов.

Обратите внимание, что если вы не используете какую-либо информацию из объединенной таблицы и просто используете ее для выбора записей, вместо нее следует использовать предложение Exists:

UPDATE ReiseMaster
SET ReiseMaster.[Attachment Indicator]  = Date() - 1
WHERE EXISTS(SELECT 1 FROM ReiseMaster_Import WHERE ReiseMaster.[Attachment Indicator] <> ReiseMaster_Import.[Attachment Indicator])
AND LEN(ReiseMaster.[Attachment Indicator]) <= 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...