Search code examples
sqlms-accessvbams-access-2016

How can I combine these two SQL queries (Access/VBA)


I am using two SQL queries in VBA that i believe they could be done in one, but I cant get it to work. I Want to turn the VBA portion into a Query outside of VBA, the VBA keeps breaking my file due to the amount of data it processes. (By break i mean it gives a message that says "this file is not a valid database" rendering the file corrupted). I search for that error but all i found was not related to breaking because of VBA code.

Anyways, here are the two queries ran with VBA.

SELECT ET.VerintEID AS EID, Sum(ET.ExceptMin)/60 AS Exeptions
FROM Tbl_VExceptTime AS ET
INNER JOIN Tbl_VCodes ON ET.Exception = Tbl_VCodes.Exception
WHERE (ET.ExceptDate Between #" & sDate & "# And #" & eDate & "#)
GROUP BY ET.VerintEID, Tbl_VCodes.IsApd
HAVING Tbl_VCodes.IsApd = ""OFF"";

I loop these results to update a table.

Do While Not .EOF
    SQL = "UPDATE Tbl_AttendanceByAgent SET EXC = " & recSet.Fields(1).Value & _
        " WHERE VerintID = '" & recSet.Fields(0).Value & "'"
    CurrentDb.Execute SQL
    .MoveNext
Loop

I know that i can save the results from the first query into a table and without looping I can update the main table with another SQL query, but I believe it can be done on a single SQL. I have tried using an UPDATE with a SELECT of the first query but it just errors out on me with an invalid syntax.


Solution

  • Yes this could be achieved in one single query as shown below

    UPDATE Tbl_AttendanceByAgent 
    SET Tbl_AttendanceByAgent.EXC = t2.Exeptions
    from Tbl_AttendanceByAgent t1
    inner join (
        SELECT ET.VerintEID AS EID, Sum(ET.ExceptMin)/60 AS Exeptions
        FROM Tbl_VExceptTime AS ET
        INNER JOIN Tbl_VCodes as TV ON ET.Exception = TV.Exception    
        WHERE (ET.ExceptDate Between #" & sDate & "# And #" & eDate & "#)
        GROUP BY ET.VerintEID, TV.IsApd
        HAVING Tbl_VCodes.IsApd = 'OFF'
    ) AS t2 on t2.EID = t1.VerintID 
    
    

    Note: I suppose you will replace sDate, eDate with values within your code