У меня есть три таблицы для работ по поиску уязвимостей: клиенты, формы авторизации и проверки. Отношения один ко многим слева направо. Ранее у меня были сканы, напрямую связанные с клиентами, но я реализовал таблицу форм, чтобы добавить возможность предотвращения сканирования без авторизации. У меня есть запрос ниже, который извлекает даты самых последних и последующих сканирований (огромное спасибо @donPablo), но когда я внес изменения в таблицы, я больше не извлекаю правильные данные из таблицы клиентов. Я не совсем уверен, как это исправить.
SELECT u.Customer_Company, z.*
FROM (Select
NZ(a.Scan_Data.Customer_ID, b.Scan_Data.Customer_ID) as Customer,
aPast as Past,
aFuture as Future,
DATEDIFF("d", aPast, aFuture) as Difference
FROM
(Select Scan_Data.Customer_ID, Max(Scan_Date) as aPast from Scan_Data where Scan_Date <= DATE() Group By Scan_Data.Customer_ID) a
LEFT JOIN
(Select Scan_Data.Customer_ID, Min(Scan_Date) as aFuture from Scan_Data where Scan_Date > DATE() Group By Scan_Data.Customer_ID) b
ON a.Scan_Data.Customer_ID = B.Scan_Data.Customer_ID
UNION
Select
NZ(a.Scan_Data.Customer_ID, b.Scan_Data.Customer_ID) as Customer,
aPast as Past,
aFuture as Future,
DATEDIFF("d", aPast, aFuture) as Difference
FROM
(Select Scan_Data.Customer_ID, Max(Scan_Date) as aPast from Scan_Data where Scan_Date <= DATE() Group By Scan_Data.Customer_ID) a
RIGHT JOIN
(Select Scan_Data.Customer_ID, Min(Scan_Date) as aFuture from Scan_Data where Scan_Date > DATE() Group By Scan_Data.Customer_ID) b
ON a.Scan_Data.Customer_ID = B.Scan_Data.Customer_ID
) AS z LEFT JOIN Customer_Data AS u ON cint(z.Customer) = cint(u.Customer_ID);
В этом запросе Scan_Data.Customer_ID становится FormID, а затем извлекает имя клиента на основе FormID. Я исправил это в других своих запросах, выполнив двойное внутреннее соединение, чтобы получить фактический CustomerID на основе FormID, но я не могу заставить это работать здесь из-за существующих объединений. Form_Data.Customer_ID - это способ, которым он определяется в таблице Form. Все идентификаторы в их первичных таблицах являются автоматически сгенерированными PK.
Таблица Customer_Data:
.Customer_ID | .Customer_Name | etc.
1 | Microsoft |
2 | Reddit |
Таблица Form_Data:
.Form_ID | .Signature_Date | .Expiration_Date | .Customer_ID
1 | 01-Jan-19 | 01-Jan-20 | 2/Reddit
2 | 15-May-18 | 15-May-21 | 1/Microsoft
Таблица Scan_Data:
.Scan_ID | .Scan_Title | .Scan_Date | .Customer_ID
1 | First MS 19052018 | 19-May-18 | 1/2/Reddit
2 | First R 05012019 | 05-Jan-19 | 2/1/Microsoft
Приведенный выше Scan_Data показывает мою проблему. Числа в поле Scan_Data.Customer_ID являются PK из двух других таблиц. Поле .Customer_ID запрашивает идентификатор клиента на основе идентификатора формы, а не фактического идентификатора клиента. Это должно показать как это:
.Scan_ID | .Scan_Title | .Scan_Date | .Customer_ID
1 | First MS 19052018 | 19-May-18 | 2/1/Microsoft
2 | First R 05012019 | 05-Jan-19 | 1/2/Reddit