[英]Extracting differences between two tables - MS Access SQL Query
我需要做的是顯示兩個表之間的所有差異。 TABLE1中存在但TABLE2中不存在的所有記錄,TABLE2中存在但TABLE1中不存在的記錄,以及另一個表中沒有匹配的Amount的記錄。
我有兩個表:
(TABLE 1)
CO_CODE ACCOUNT_ID CONTRACT STATUS AMT
A 7 101 ACTIVE 5,497.00
A 7 101 ACTIVE 5,482.00
A 15 106 INACTIVE 0.00
A 23 102 ACTIVE 4,562.00
A 31 102 ACTIVE 22.00
A 49 103 ACTIVE 1,900.00
A 49 103 ACTIVE 135.00
(TABLE 2)
Company Account_Number Amount Agreement
A 7 5,497.00 S000101
A 23 8,457.00 S000102
A 49 135.00 S000103
A 56 2,465.00 S000104
A 7 5,482.00 S000101
這兩個表共享具有公司ID,帳號,金額和協議/合同號的字段,其中表2中的協議為文本類型,而表1中為數字類型。
到目前為止,我想出了:
SELECT TABLE1.CO_CODE AS Company, TABLE1.ACCOUNT_ID AS [Account Number], TABLE1.CONTRACT As [Contract Number], TABLE1.STATUS AS Status, TABLE1.AMT, TABLE2.Amount
FROM TABLE1 LEFT JOIN TABLE2 ON TABLE1.ACCOUNT_ID = TABLE2.Account_Number
WHERE ((Exists (SELECT * FROM TABLE2 WHERE TABLE1.CO_CODE = TABLE2.Company AND TABLE1.ACCOUNT_ID = TABLE2.Account_number AND TABLE1.CONTRACT = Clng(MID(TABLE2.Agreement,5)) AND TABLE1.AMT = TABLE2.Amount))=False) OR ((Exists (SELECT * FROM TABLE1 WHERE TABLE1.CO_CODE = TABLE2.Company AND TABLE1.ACCOUNT_ID = TABLE2.Account_number AND TABLE1.CONTRACT = Clng(MID(TABLE2.Agreement,5)) AND TABLE1.AMT = TABLE2.Amount))=False)
UNION ALL
SELECT TABLE2.Company, TABLE2.Account_Number, CLng(MID(TABLE2.Agreement, 5)), TABLE1.ACC_STATUS, TABLE1.AMT, TABLE2.Amount
FROM TABLE2 LEFT JOIN TABLE1 ON TABLE1.ACCOUNT_ID = TABLE2.Account_Number
WHERE TABLE1.ACCOUNT_ID NOT IN (SELECT Account_Number FROM TABLE2) OR TABLE2.Account_Number NOT IN (SELECT ACCOUNT_ID FROM TABLE1);
這給了我結果:
Company Account Contract Status AMT Amount
A 15 106 INACTIVE 0.00
A 23 102 ACTIVE 4,562.00 8,457.00
A 31 102 ACTIVE 22.00
A 49 103 ACTIVE 1,900.00 135.00
A 56 104 2,465.00
金額為135.00的帳戶49不應顯示金額135.00,因為它在兩個表中都出現,但是1900.00的amt是正確的(僅出現在表1中)。
有人可以告訴我為什么會這樣以及如何解決嗎?
對於缺乏MS Access SQL和整個網站的知識,我深表歉意。 在過去的一周中,我一直在努力尋找如何獲得期望的結果,任何幫助將不勝感激。
免責聲明:我絕不是SQL方面的專家,因此我的解決方案可能效率不高甚至是錯誤的,但是它在我自己的測試環境中有效。
請嘗試以下操作:
SELECT T1.CO_CODE AS Company, T1.ACCOUNT_ID AS [Account Number], T1.STATUS AS Status, T1.CONTRACT As [Contract Number], T1.AMT AS [Table 1], "" AS [Table 2]
FROM TABLE1 T1
WHERE NOT EXISTS (
SELECT * FROM TABLE2 T2
WHERE T1.CO_CODE = T2.Company
AND T1.Account_ID = T2.Account_Number
AND T1.CONTRACT = CLng(MID(TABLE2.Agreement, 5))
AND T1.AMT = T2.Amount
)
UNION ALL
SELECT T2.Company, T2.Account_Number AS [Account Number], "" AS Status, CLng(MID(TABLE2.Agreement, 5)) AS [Contract Number], "" AS [Table 1], T2.Amount AS [Table 2]
FROM TABLE2 T2
WHERE NOT EXISTS (
SELECT * FROM TABLE1 T1
WHERE T1.CO_CODE = T2.Company
AND T1.Account_ID = T2.Account_Number
AND T1.CONTRACT = CLng(MID(TABLE2.Agreement, 5))
AND T1.AMT = T2.Amount
)
結果如下:
-----------------------------------------------------------------
|Company|Account Number| Status |Contract Number|Table 1|Table 2|
-----------------------------------------------------------------
| A | 15 |INACTIVE| 106 | 0 | |
| A | 23 | ACTIVE | 102 | 4562 | |
| A | 31 | ACTIVE | 102 | 22 | |
| A | 49 | ACTIVE | 103 | 1900 | |
| A | 23 | | 102 | | 8457 |
| A | 56 | | 104 | | 2465 |
-----------------------------------------------------------------
我不知道您的每一列是什么類型,因此可能需要對查詢進行一些修改以匹配您的數據。 您可能還想將列重命名為其他名稱,我只是在輸入數據。
請注意,每個表中有兩個不同金額的記錄顯示了兩次(即,示例中的帳戶#23)。 我不知道這對您來說是否可以接受,但這是我想出的。
我希望這會有所幫助,或者至少會為您提供其他嘗試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.