MS Access UPDATE запрос добавляет новые строки - PullRequest
0 голосов
/ 05 июня 2018

Я озадачен, почему это происходит.Это мой запрос ОБНОВЛЕНИЯ в MS ACCESS:

UPDATE TempMyTable AS b
RIGHT JOIN MyTable AS a ON (a.[ID] = b.[ID])
AND (a.T3 = b.T3) AND (a.T2 = b.T2) AND (a.T1 = b.T1)
SET b.T1 = a.T1, b.T2 = a.T2, b.T3 = a.T3
WHERE (((b.ID) Is Null));

Я проверяю изменения в столбцах T1, T2 и T3.Если есть изменения, обновите столбцы в строках TempMyTable.Однако происходит то, что новые строки добавляются с пустыми значениями во все поля, кроме значений для T1, T2 и T3.

EDIT: решение, используйте INNER JOIN и проверьте, не совпадают ли столбцы с '<> 'оператор.

UPDATE TempMyTable AS b
INNER JOIN MyTable AS a
ON ((a.T1 <> b.T1) OR (a.T2 <> b.T2) OR (a.T3 <> b.T3))
AND (a.[ID] = b.[ID])
SET b.T1 = a.T1, b.T2 = a.T2, b.T3 = a.T3;

1 Ответ

0 голосов
/ 05 июня 2018

Вы используете RIGHT JOIN, который будет включать строки, в которых ничего не существует в MyTable.Эти строки обновляются (запрос UPDATE в Microsoft Access всегда влияет на строки обеих таблиц при использовании объединений, даже если вы используете Set только для столбцов в одной таблице), создавая новые строки.

Измените объединение на INNER JOIN:

UPDATE TempMyTable AS b
INNER JOIN MyTable AS a ON (a.[ID] = b.[ID])
AND (a.T3 = b.T3) AND (a.T2 = b.T2) AND (a.T1 = b.T1)
SET b.T1 = a.T1, b.T2 = a.T2, b.T3 = a.T3
WHERE (((b.ID) Is Null));

Обратите внимание, однако, что этот запрос ничего не делает, так как вы проверяете WHERE (((b.ID) Is Null)); и присоединяетесь к b.ID.Это означает, что Access не сможет вернуть строки ни при каких обстоятельствах.Вы, вероятно, захотите удалить это предложение WHERE.

В конце OP искала различия с совпадающими идентификаторами, поэтому использовался следующий запрос:

UPDATE TempMyTable AS b
INNER JOIN MyTable AS a
ON ((a.T1 <> b.T1) OR (a.T2 <> b.T2) OR (a.T3 <> b.T3))
AND (a.[ID] = b.[ID])
SET b.T1 = a.T1, b.T2 = a.T2, b.T3 = a.T3;
...