MS Access 2016 - Pull client name from separate table in complex query

蹲街弑〆低调 提交于 2019-12-13 03:39:40

问题


I have three tables for vulnerability scanning jobs: customers, authorization forms, and scans. Relationships are one to many from left to right. I previously had scans directly related to clients, but implemented the forms table to add the ability to prevent scanning without authorization. I have the below query which pulls the dates of the most recent and next coming scans (huge thanks to @donPablo), but when I made the change in tables I'm no longer pulling the correct data from the customers table. I'm not exactly sure how to fix it.

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);

In this query the Scan_Data.Customer_ID winds up being the FormID and it then pulls the customer's name based on the FormID. I fixed it in my other queries by doing a double inner join to pull the actual CustomerID based on the FormID, but I can't get that to work here because of the existing joins. Form_Data.Customer_ID is the way it's identified in the Form table. All IDs in their primary tables are autonumber generated PKs.

Customer_Data table:

.Customer_ID | .Customer_Name | etc.
     1       | Microsoft     |
     2       | Reddit        |

Form_Data table:

.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 table:

.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

The above Scan_Data shows the problem I'm having. The numbers in the Scan_Data.Customer_ID field are the PKs from the other two tables. The .Customer_ID field is pulling the customer ID based upon the form ID and not the actual customer ID. It should show like this:

.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

来源:https://stackoverflow.com/questions/58747356/ms-access-2016-pull-client-name-from-separate-table-in-complex-query

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!