MS Access 2016 - извлечение имени клиента из отдельной таблицы в сложном запросе - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть три таблицы для работ по поиску уязвимостей: клиенты, формы авторизации и проверки. Отношения один ко многим слева направо. Ранее у меня были сканы, напрямую связанные с клиентами, но я реализовал таблицу форм, чтобы добавить возможность предотвращения сканирования без авторизации. У меня есть запрос ниже, который извлекает даты самых последних и последующих сканирований (огромное спасибо @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
...