Subquery

如何根據它們在另一個表中的存在從表中減去記錄

  • May 28, 2015

我有一個 Access 2010 表Assignment

key Empl    Number
key Year    Number
key Week    Number
key Proj    Number

它在給定的工作週內將員工分配到零個或多個項目,因此,所有四列構成複合鍵。我有另一個表,Import具有相同的結構,包含要用於Assignment根據不同選項更新的數據。

選項 1 保留所有現有分配,添加全新的導入,並忽略任何已經存在的導入。

我可以使用一個簡單的追加查詢來管理它:

INSERT INTO Assignment 
SELECT *
FROM Import 

到目前為止,一切都很好。

選項 2 如上所述,除非分配和導入之間存在員工-年-週匹配,否則將現有分配替換為導入。

實現此目的的一種方法是首先刪除所有符合員工年周匹配的記錄,然後附加導入(如上)。結果應該是按原樣替換完全匹配,用新項目替換部分(員工-年-週)匹配,並添加全新的任務。

我可以通過此查詢隔離匹配項,稱為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

如何從中刪除Assignment記錄Existing

我已經嘗試過這個

DELETE 
FROM Assignment
WHERE IN (Existing)

所有導致錯誤消息。

順便說一句,如果有這樣的動物,我似乎可以使用MINUS(或DIFFERENCE)查詢:

Assignment
MINUS
Existing

該方法的一個小變化是首先刪除具有員工-年-週匹配和項目不匹配的記錄,然後追加導入,如選項 1 中所示。(刪除和添加更少,但結果相同。)

我可以通過這個查詢隔離這些匹配,稱為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

但是我仍然要完成如何從中刪除記錄的Assignment任務Existing_exp

答案似乎隱藏在顯而易見的地方:

DELETE 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

要麼

DELETE 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

取決於哪個最合適。

我不知道我第一次怎麼看不到它!

引用自:https://dba.stackexchange.com/questions/102634