доступ сравнить три таблицы - PullRequest
1 голос
/ 11 марта 2019

enter image description here

enter image description here

Есть ли способ тройной проверки соответствия данных между тремя таблицами и показать, есть ли расхождения в какой-либо из трех таблиц?

Каждая таблица не полностью одинакова, но все они имеют столбцы 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

Но есть только 30 записей, но я получаю 5 или 6 копий и получаю более 30000 строк / записей в запросе ...

Ответы [ 2 ]

0 голосов
/ 11 марта 2019

Рассмотрим подзапросы в предложениях 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)
0 голосов
/ 11 марта 2019

Вы выполняете полное перекрестное объединение трех таблиц, поэтому для каждой комбинации строки 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, заменить последнее «ИЛИ» на «И».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...