SQL предотвращает дублирование записей от добавления - PullRequest
0 голосов
/ 01 февраля 2019

Что мне нужно добавить в этот оператор SQL, чтобы сказать, что если ProductionOrderNo в SPECIALS_Output уже существует, не добавлять запись из TEMP_Specials?ProductionOrderNo в SPECIALS_Output уже является PrimaryKey.

strSqlAddTempSpecials = "INSERT INTO SPECIALS_Output ( ProductionOrderNo, ItemNo, Description, ExtraDescription, Quantity, ItemWeight, CreationDate, DueDate, StartingDate, Length ) " & _
"SELECT TEMP_Specials.ProductionOrderNo, TEMP_Specials.ItemNo, TEMP_Specials.Description, TEMP_Specials.ExtraDescription, TEMP_Specials.Quantity, TEMP_Specials.ItemWeight, TEMP_Specials.CreationDate, TEMP_Specials.DueDate, TEMP_Specials.StartingDate, LintelInfo.Length " & _
"FROM TEMP_Specials LEFT JOIN LintelInfo ON TEMP_Specials.ItemNo = LintelInfo.[No] " & _
"WHERE (((LintelInfo.ItemType)<>" & Chr(34) & "Brick" & Chr(34) & " And (LintelInfo.ItemType)<>" & Chr(34) & "#N/A" & Chr(34) & " And (LintelInfo.ItemType)<>" & Chr(34) & "Windpost Kit" & Chr(34) & ") AND ((TEMP_Specials.Status)=" & Chr(34) & "Finished" & Chr(34) & "));"

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Одним из решений было бы добавить условие к запросу, который фильтрует наши записи, принадлежащие ProductionOrderNo, которые уже существуют в целевой таблице.

Это можно сделать с помощью LEFT JOIN в сочетании с WHERE ... IS NULL или с условием NOT EXISTS в коррелированном подзапросе.

Вот решение с помощью LEFT JOIN:

strSqlAddTempSpecials = 
    "INSERT INTO SPECIALS_Output ( ProductionOrderNo, ItemNo, Description, ExtraDescription, Quantity, ItemWeight, CreationDate, DueDate, StartingDate, Length ) " & _
"SELECT TEMP_Specials.ProductionOrderNo, TEMP_Specials.ItemNo, TEMP_Specials.Description, TEMP_Specials.ExtraDescription, TEMP_Specials.Quantity, TEMP_Specials.ItemWeight, TEMP_Specials.CreationDate, TEMP_Specials.DueDate, TEMP_Specials.StartingDate, LintelInfo.Length " & _
"FROM TEMP_Specials LEFT JOIN LintelInfo ON TEMP_Specials.ItemNo = LintelInfo.[No] " & _
"LEFT JOIN SPECIALS_Output ON SPECIALS_Output.ProductionOrderNo = TEMP_Specials.ProductionOrderNo " & _
"WHERE ((SPECIALS_Output.ProductionOrderNo IS NULL) AND ((LintelInfo.ItemType)<>" & Chr(34) & "Brick" & Chr(34) & " And (LintelInfo.ItemType)<>" & Chr(34) & "#N/A" & Chr(34) & " And (LintelInfo.ItemType)<>" & Chr(34) & "Windpost Kit" & Chr(34) & ") AND ((TEMP_Specials.Status)=" & Chr(34) & "Finished" & Chr(34) & "));"

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

0 голосов
/ 01 февраля 2019

вы можете создать уникальный индекс для ProductionOrderNo

Открыть таблицу в режиме конструктора в MS Access, выбрать ProductionOrderNo и в свойствах (Общие) выбрать Indexed: yes (No Duplicates),

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...