访问比较三个表

时间:2019-03-11 14:20:54

标签: sql ms-access

enter image description here

enter image description here

是否可以通过三种方法检查三个表之间的数据是否一致,并显示三个表中是否存在任何差异?

每个表并不完全相同,但是它们都有一个EmployeeIDamountdatepaidCID列。

当我处理两个表时,我认为我的SQL是:

SELECT tbMaster.EmployeeID, tbMaster.Amount, tbMaster.DatePaid, tbMaster.CID
FROM tbMaster LEFT JOIN tbCID ON (tbMaster.CID = tbCID.CID) AND (tbMaster.Amount = tbCID.Amount) AND (tbMaster.DatePaid = tbCID.DatePaid)
WHERE (((tbMaster.[Advance/paid])="Paid Respondent") AND ((tbCID.CID) Is Null));

它有效,但是如果tbCID有任何差异,就不会抓住它...

对于这三个表,我认为:

SELECT tbMaster.EmployeeID, tbMaster.Amount, tbMaster.DatePaid, tbMaster.[Advance/paid], tbMaster.CID
FROM tbMaster, tbCID, table3
WHERE tbMaster.CID <> tbCID.CID
OR  table3.CID <> tbMaster.CID
OR  table3.CID <> tbCID.CID
OR tbMaster.Amount <> tbCID.Amount
OR  table3.AMOUNT <> tbMaster.AMOUNT
OR  table3.AMOUNT <> tbCID.AMOUNT
OR tbMaster.Datepaid <> tbCID.Datepaid
OR  table3.DATEPAID <> tbMaster.DATEPAID
OR  table3.DATEPAID <> tbCID.DATEPAID

但是只有30个条目,但是我得到了5x或6x副本,并且在查询中获得了超过30000行/条目...

2 个答案:

答案 0 :(得分:0)

您正在对三个表进行完全交叉联接,因此对于tbMaster行,tbCID行和table3行的三个组合在三个列上都不匹配的情况,将返回一行。

如果您尝试返回的tbMaster行中CID,Amount和DatePaid均未同时出现在tbSUID和table3中,则您需要类似于第一个查询的内容:

SELECT tbMaster.EmployeeID, tbMaster.Amount, tbMaster.DatePaid, tbMaster.CID
FROM tbMaster 
LEFT JOIN tbSUID ON (tbMaster.CID = tbSUID.CID) AND (tbMaster.Amount = tbSUID.Amount) AND (tbMaster.DatePaid = tbSUID.DatePaid)
LEFT JOIN table3 ON (tbMaster.CID = table3.CID) AND (tbMaster.Amount = table3.Amount) AND (tbMaster.DatePaid = table3.DatePaid)
WHERE ((tbMaster.[Advance/paid])="Paid Respondent") 
AND ((tbCID.CID) Is Null) OR (table3.CID Is Null));

如果记录必须只出现在tbSUID和table3之一中,则用“ AND”替换最后一个“ OR”。

答案 1 :(得分:0)

NOT EXISTS子句中考虑子查询:

SELECT m.EmployeeID, m.Amount, m.DatePaid, m.[Advance/paid], m.CID
FROM tbMaster m
WHERE NOT EXISTS
  (SELECT 1 FROM tbCID c
   WHERE c.CID = m.CID OR c.AMOUNT = m.AMOUNT OR c.DATEPAID = m.DATEPAID)

OR NOT EXISTS
  (SELECT 1 FROM table3 t
   WHERE t.CID = m.CID OR t.AMOUNT = m.AMOUNT OR t.DATEPAID = m.DATEPAID)

对于反向比较,请考虑添加带有 source_table 指示符的并集查询:

SELECT m.EmployeeID, m.Amount, m.DatePaid, m.[Advance/paid], m.CID, 
       'tbMaster' AS [source_table]
FROM tbMaster m
WHERE NOT EXISTS
  (SELECT 1 FROM tbCID c
   WHERE c.CID = m.CID OR c.AMOUNT = m.AMOUNT OR c.DATEPAID = m.DATEPAID)
OR NOT EXISTS
  (SELECT 1 FROM table3 t
   WHERE t.CID = m.CID OR t.AMOUNT = m.AMOUNT OR t.DATEPAID = m.DATEPAID)

UNION ALL

SELECT c.EmployeeID, c.Amount, c.DatePaid, c.[Advance/paid], c.CID, 
       'tbCID' AS [source_table]
FROM tbCID c
WHERE NOT EXISTS
  (SELECT 1 FROM tbMaster m
   WHERE m.CID = c.CID OR m.AMOUNT = c.AMOUNT OR m.DATEPAID = c.DATEPAID)
OR NOT EXISTS
  (SELECT 1 FROM table3 t
   WHERE t.CID = c.CID OR t.AMOUNT = c.AMOUNT OR t.DATEPAID = c.DATEPAID)

UNION ALL

SELECT t.EmployeeID, t.Amount, t.DatePaid, t.[Advance/paid], t.CID, 
       'table3' AS [source_table]
FROM table3 t
WHERE NOT EXISTS
  (SELECT 1 FROM tbMaster m
   WHERE m.CID = t.CID OR m.AMOUNT = t.AMOUNT OR m.DATEPAID = t.DATEPAID)
OR NOT EXISTS
  (SELECT 1 FROM tbCID  c
   WHERE c.CID = t.CID OR c.AMOUNT = t.AMOUNT OR c.DATEPAID = t.DATEPAID)