Eu tenho uma tabela do Access 2010Assignment
key Empl Number
key Year Number
key Week Number
key Proj Number
Ele atribui aos funcionários zero ou mais projetos para determinadas semanas de trabalho, portanto, todas as quatro colunas compõem a chave composta. Tenho outra tabela, Import
, com estrutura idêntica, contendo dados a serem utilizados para atualização Assignment
de acordo com diferentes opções.
Opção 1 Mantenha todas as atribuições existentes, adicione importações completamente novas e ignore quaisquer importações que já existam.
Posso gerenciar isso usando uma simples consulta de acréscimo:
INSERT INTO Assignment
SELECT *
FROM Import
Até agora tudo bem.
Opção 2 Como acima, exceto onde há uma correspondência empregado-ano-semana entre a atribuição e a importação, substitua a atribuição existente pela importação.
Uma abordagem para conseguir isso é primeiro excluir todos os registros com uma correspondência funcionário-ano-semana e, em seguida, acrescentar as importações (como acima). O resultado deve ser substituir correspondências exatas como estão, substituir correspondências parciais (funcionário-ano-semana) por novos projetos e adicionar atribuições completamente novas.
Posso isolar as correspondências por meio desta consulta, chamada Existing
:
SELECT a.*
FROM Import AS i INNER JOIN Assignment AS a
ON a.Empl = i.Empl AND a.Year = i.Year AND a.Week = i.Week
Como posso excluir registros Assignment
que também estão em Existing
?
Eu tentei variações sobre isso
DELETE
FROM Assignment
WHERE IN (Existing)
tudo resultando em mensagens de erro.
A propósito, parece que, se existisse tal animal , eu poderia usar uma MINUS
(ou DIFFERENCE
) consulta:
Assignment
MINUS
Existing
Uma pequena variação na abordagem seria primeiro excluir os registros com uma correspondência funcionário-ano-semana e uma incompatibilidade de projeto e , em seguida, anexar as importações, como na Opção 1. (Menos exclusões e adições, mas mesmo resultado.)
Posso isolar essas correspondências por meio desta consulta, chamada Existing_exp
:
SELECT a.*
FROM Import AS i INNER JOIN Assignment AS a
ON a.Empl = i.Empl AND a.Year = i.Year AND a.Week = i.Week AND a.Proj <> i.Proj
mas ainda me resta a tarefa de como deletar os registros Assignment
que estão em Existing_exp
!
Parece que a resposta estava escondida à vista de todos:
ou
dependendo do que for mais adequado.
Não sei como não consegui ver da primeira vez!