Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 访问并比较三个表_Sql_Ms Access - Fatal编程技术网

Sql 访问并比较三个表

Sql 访问并比较三个表,sql,ms-access,Sql,Ms Access,是否有办法三次检查三个表之间的数据是否一致,并显示三个表中是否存在任何差异 每个表并不完全相同,但它们都有一个EmployeeID、amount、datepaid和CID列 当我处理两个表时,我认为SQL是: SELECT tbMaster.EmployeeID, tbMaster.Amount, tbMaster.DatePaid, tbMaster.CID FROM tbMaster LEFT JOIN tbCID ON (tbMaster.CID = tbCID.CID) AND (tbM

是否有办法三次检查三个表之间的数据是否一致,并显示三个表中是否存在任何差异

每个表并不完全相同,但它们都有一个
EmployeeID
amount
datepaid
CID

当我处理两个表时,我认为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
选择tbMaster.EmployeeID、tbMaster.Amount、tbMaster.DatePaid、tbMaster.[Advance/paid],tbMaster.CID
来自tbMaster,tbCID,表3
其中tbMaster.CID tbCID.CID
或表3.CID tbMaster.CID
或表3.CID tbCID.CID
或tbMaster.金额tbCID.金额
或表3.AMOUNT.Tmaster.AMOUNT
或表3.金额待定。金额
或tbMaster.已付款tbCID.已付款
或表3.DatePayed tbMaster.DatePayed
或表3.DatePayed tbCID.DatePayed

但是只有30个条目,但我得到了5倍或6倍的副本,并且在查询中得到了30000多行/条目…

您正在对三个表进行完全交叉连接,因此,对于tbMaster行、tbCID行和table3行的每一个组合,如果这三个行在三列上不匹配,将返回一行

如果您试图返回一个tbMaster行,其中CID、Amount和DatePayed未同时出现在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和表3中的一个中,则将最后一个“或”替换为“和”。

您正在对三个表进行完全交叉联接,因此对于tbMaster行、tbCID行和表3行的每一个组合,如果三个行在三列上不匹配,则将返回一行

如果您试图返回一个tbMaster行,其中CID、Amount和DatePayed未同时出现在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和表3中的一个中,则将最后一个“或”替换为“和”。

考虑
不存在
子句中的子查询:

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)

为反向比较,考虑添加SoeCixLoad指示符的联合查询:

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)

考虑
不存在
子句中的子查询:

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)

为反向比较,考虑添加SoeCixLoad指示符的联合查询:

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)

请提供样本数据和预期结果。不清楚你想做什么。另外,如果您感兴趣的列在一个表中存在重复项,请说明如何处理这些重复项。对不起,您的问题不清楚。你能添加一些屏幕截图并澄清你的问题吗?对不起,戈登和易卜拉希莫扎贡,我将得到3张表格,试图对数据进行三重检查,以确保他们在同一日期对同一个人拥有相同的金额。如果没有,他们希望只显示不同的。请提供样本数据和预期结果。不清楚你想做什么。另外,如果您感兴趣的列在一个表中存在重复项,请说明如何处理这些重复项。对不起,您的问题不清楚。你能添加一些屏幕截图并澄清你的问题吗?对不起,戈登和易卜拉希莫扎贡,我将得到3张表格,试图对数据进行三重检查,以确保他们在同一日期对同一个人拥有相同的金额。如果他们不喜欢,他们希望那些不同的只显示。唐,谢谢!我明白了<代码>选择tbMaster.EmployeeID、tbMaster.Amount、tbMaster.DatePaid、tbMaster.[预付款/已付款]、tbMaster.CID FROM(tbMaster LEFT-JOIN-tbCID ON(tbMaster.DatePaid=tbCID.DatePaid)和(tbMaster.Amount=tbCID.Amount)和(tbMaster.CID=tbCID=tbCID.CID))左联表3和(tbMaster.DatePaid=table3.DatePaid)和(tbMaster.Amount=表3.Amount),其中(((tbMaster.[预付款/已付款]=“已付答辩人”)和((tbCID.CID)为空)或((tbMaster.[预付款/已付款]=“已付答辩人”)和((表3.CID)为空))谢谢!MS Access SQL需要在多个
JOIN
子句周围加括号,如OP所示。我意识到,此查询只会告诉主表中是否存在表CID或表3中不存在但不存在相反的付费响应者记录,也不会对照表3检查表CID…Don,谢谢!我知道了e> 选择tbMaster.EmployeeID、tbMaster.Amount、tbMaster.DatePaid、tbMaster.[预付款/已付款],tbMaster.CID从(tbMaster左键加入tbCID ON(tbMaster.DatePaid=tbCID.DatePaid)和(tbMaster.Amount=tbCID.Amount)左键加入(tbMaster.CID=table3.CID)和(tbMaster.DatePaid=table3.DatePaid)和(tbMaster.Amount=表3.Amount),其中(((tbMaster.[预付款/已付款]=“已付答辩人”)和((tbCID.CID)为空)或((tbMaster.[预付款/已付款]=“已付答辩人”)和((表3.CID)为空))谢谢!MS Access SQL需要在多个
JOIN
子句周围加括号,如OP所示。我意识到,此查询只会告诉主表中是否存在表CID或表3中不存在但不存在相反的付费响应者记录,也不会对照表3检查表CID……谢谢您,这同样有效上面的一个!我可以问一下是否有办法查看t.CID=c.CID…是否也可以?我尝试添加反向,但它不起作用添加用于反向比较的联合查询。请参阅编辑。谢谢您,这与上面的一个一样有效!我可以问一下是否有办法查看t.CID=c.CID…是否也可以?我尝试添加反向,但它不起作用添加联合查询有关反向比较的详细信息,请参见编辑。