ms-accessinner-join

How to query all the ID of the first table with the last Event and the first Date on the second table related one-to-many to the first?


I'm trying to retrieve from two tables related one-to-many (Subattivita.ID-Eventi-IDSubattivita), some fields from first table and two other fields to the second table (last Eventi.Evento and first Eventi.DataInserimento).

I don't know why I get an error with the following SQL query. Can someone help, please?

First Table: Subattivita

ID Contenuto
1 Prova
2 Prova2
3 Prova3
4 prova4
5 Prova5
6 Prova6
7 prova7
9 Realizzare disegno
10 Prova8

Second Table: Eventi

ID IDSubattivita Evento Commento DataInserimento
1 1 Aperta Inserimento automatico 01/08/2024
2 2 Aperta Inserimento automatico 01/08/2024
3 3 Aperta Inserimento automatico 01/08/2024
4 4 Aperta Inserimento automatico 01/08/2024
5 5 Aperta Inserimento automatico 02/08/2024
8 6 Aperta Inserimento automatico 02/08/2024
9 7 Aperta Inserimento automatico 02/08/2024
12 9 Aperta Inserimento automatico 02/08/2024
13 10 Aperta Inserimento automatico 02/08/2024
14 1 Remarks Testo1 05/08/2024
15 2 Remarks Testo2 05/08/2024
16 3 Remarks Testo3 06/08/2024
17 4 Remarks Testo4 06/08/2024
18 5 Remarks Testo5 07/08/2024
19 6 Remarks Testo8 08/08/2024
20 7 Remarks Testo9 09/08/2024
21 9 Remarks Testo12 09/08/2024
22 9 Remarks Procedi con disegno. 09/08/2024
23 9 Caricata Disegno caricato. 09/08/2024
24 9 Chiusa Disegno approvato 09/08/2024

Required results of query:

ID LastEvento FirstDataInserimento
1 Remarks 01/08/2024
2 Remarks 01/08/2024
3 Remarks 01/08/2024
4 Remarks 01/08/2024
5 Remarks 02/08/2024
6 Remarks 02/08/2024
7 Remarks 02/08/2024
9 Chiusa 02/08/2024
10 Aperta 02/08/2024

I've tried with the following SQL query, but Access asks to enter the u.Evento value:

SELECT 
    t.ID, 
    u.Evento as LastEvento, 
    p.DataInserimento as FirstDataInserimento
FROM 
    ((Subattivita t
INNER JOIN 
    (SELECT IDSubattivita, MAX(ID) as MaxID FROM Eventi GROUP BY IDSubattivita) u ON t.ID = u.IDSubattivita)
INNER JOIN 
    (SELECT IDSubattivita, MIN(ID) as MinID FROM Eventi GROUP BY IDSubattivita) p ON t.ID = p.IDSubattivita);

Access message:


Solution

  • That's not an error message. It is a prompt from query for input of value because query references field(s) not in dataset - as noted by @TimRoberts. Looks like you want the Min(DataInserimento) for each IDSubattivita. Pulling Evento associated with maximum ID for each IDSubattivita is more complicated. Consider:

    SELECT Q.IDSubattivita, Evento AS LastEvento, FirstDataInserimento FROM Eventi INNER JOIN 
        (SELECT Eventi.IDSubattivita, Max(Eventi.ID) AS EID, 
         Min(Eventi.DataInserimento) AS FirstDataInserimento FROM Eventi
         GROUP BY Eventi.IDSubattivita) AS Q 
    ON Eventi.ID=Q.EID;
    

    Or this version:

    SELECT Subattivita.ID, Contenuto, 
       (SELECT TOP 1 Evento FROM Eventi AS Dup 
        WHERE IDSubattivita=Subattivita.ID ORDER BY ID DESC) AS LastEvento, 
       (SELECT TOP 1 DataInserimento FROM Eventi AS Dup WHERE 
        IDSubattivita=Subattivita.ID ORDER BY ID) AS FirstDataInserimento
    FROM Subattivita;