Query SQL con ultimi record tra due tabelle collegate

di il
6 risposte

Query SQL con ultimi record tra due tabelle collegate

Ciao a tutti,
sono nuovo ho bisogno di fare una query che selezioni solo gli ultimi record di una tabella che è in relazione uno a molti con un’altra. Le tabelle sono:
tblAnagrafica:
- IDEsposto (chiave primaria)
- Cognome
- Nome
- DataNascita
- IDQualifica
- ………ecc
tblDatiOccupazionali:
- IDDatiOccupazionali (chiave primaria, contatore)
- IDEsposto (numerico)
- IDSediLavoro
- IDDestinazioneLavorativa
- DataInizioOccupazione
- IDClassificazione (testo)
- IDStatoServizio (testo)
- ……………….ecc

(gli ultimi cinque campi sono popolati con una casella combinata)
Queste due tabelle sono in relazione tra di loro 1 a molti: tblAnagrafica.IDEsposto=tblDatiOccupazionali.IDEsposto

Ho bisogno di fare una query con i campi IDEsposto, Cognome, Nome della tblAnagrafica e alcuni campi dell’ultima riga della tblDatiOccupazionali: IDEsposto, IDSediLavoro, IDDestinazioneLavorativa, DataInizioOccupazione, IDClassificazione, IDStatoServizio.
La riga selezionata della tblDatiOccupazionali deve contenere la data più recente del campo DataInizioOccupazione con i record degli altri campi corrispondenti. Ho provato ad utilizzare nella query la funzione Max per la data e Ultimo per gli altri campi ma i record che ottengo non sono corrispondenti all’ultima riga della tblDatiOccupazionali.
La mia query è la seguente (access 2013):
SELECT tblAnagrafica.IDEsposto, tblAnagrafica.Cognome, tblAnagrafica.Nome, tblAnagrafica.DataNascita, tblAnagrafica.IDQualifica, Last(tblDatiOccupazionali.IDSediLavoro) AS UltimoDiIDSediLavoro, Last(tblDatiOccupazionali.IDDestinazioneLavorativa) AS UltimoDiIDDestinazioneLavorativa, Max(tblDatiOccupazionali.DataInizioOccupazione) AS MaxDiDataInizioOccupazione, Last(tblDatiOccupazionali.IDClassificazione) AS UltimoDiIDClassificazione, Last(tblDatiOccupazionali.IDStatoServizio) AS UltimoDiIDStatoServizio

FROM tblAnagrafica INNER JOIN tblDatiOccupazionali 
ON tblAnagrafica.IDEsposto = tblDatiOccupazionali.IDEsposto
GROUP BY tblAnagrafica.IDEsposto, tblAnagrafica.Cognome, tblAnagrafica.Nome, tblAnagrafica.DataNascita, tblAnagrafica.IDQualifica;
Purtroppo non mi dà i record corrispondenti all’ultima riga della tblDatiOccupazionali, mi potete aiutare per favore? Grazie

6 Risposte

  • Re: Query SQL con ultimi record tra due tabelle collegate

    franz64 ha scritto:


    Ciao a tutti,
    .................................
    Purtroppo non mi dà i record corrispondenti all’ultima riga della tblDatiOccupazionali, mi potete aiutare per favore? Grazie
    Se ti interessa solo l'ultimo record prova così:
    SELECT LAST(tblAnagrafica.IDEsposto) AS IDE, LAST(tblAnagrafica.Cognome) AS COGNOME, LAST(tblAnagrafica.Nome) AS NOME, LAST(tblAnagrafica.DataNascita) AS DATAN, LAST(tblAnagrafica.IDQualifica) AS QUALIFICA, Last(tblDatiOccupazionali.IDSediLavoro) AS UltimoDiIDSediLavoro, Last(tblDatiOccupazionali.IDDestinazioneLavorativa) AS UltimoDiIDDestinazioneLavorativa, LAST(tblDatiOccupazionali.DataInizioOccupazione) AS MaxDiDataInizioOccupazione, Last(tblDatiOccupazionali.IDClassificazione) AS UltimoDiIDClassificazione, Last(tblDatiOccupazionali.IDStatoServizio) AS UltimoDiIDStatoServizio
    
    FROM tblAnagrafica INNER JOIN tblDatiOccupazionali 
    ON tblAnagrafica.IDEsposto = tblDatiOccupazionali.IDEsposto
    GROUP BY tblAnagrafica.IDEsposto
    HAVING LAST(tblDatiOccupazionali.IDDatiOccupazionali)=MAX(tblDatiOccupazionali.IDDatiOccupazionali)
    
  • Re: Query SQL con ultimi record tra due tabelle collegate

    Scusa è partito il messaggio per errore ma non avevo finito di rispondere.
    Il risultato che vorrei ottenere è il seguente: poiché ogni persona (chiave primaria IDEsposto) ha molti dati occupazionali che si trovano in una tabella collegata tblDatiOccupazionali (chiave primaria IDDatiOccupazionali) uno a molti, sono interessato ad avere i dati occupazionali più recenti che si trovano nell'ultima riga di record di quest'ultima tabella.
    La cosa strana è che nella query mancano i dati di un gruppo di persone che hanno dei dati occupazionali. E aprendo la tabella collegata tblDatiOccupazionali li trovo tutti. Non riesco a capire se ciò sia dovuto al fatto la chiave IDEsposto sia un contatore numerico che inserisco io, mentre l'altra chiave primaria IDDatiOccupazionali sia un contatore automatico, oppure forse è un problema di indicizzazione/compattazione o altro.
    Grazie per l'aiuto.
    Francesco
  • Re: Query SQL con ultimi record tra due tabelle collegate

    Do una "non risposta". Nel senso che non dico come fare (non ho guardato tantissimo) ma cosa sicuramente non si deve fare.
    Non usare (D)Last, non è affidabile. Bisogna "giocare" con Max o Min e/o con appositi criteri di ordinamento applicati esplicitamente.
    Quando scrivi
    (gli ultimi cinque campi sono popolati con una casella combinata)
    intendi che già in visualizzazione tabella sono combobox? Che detto in un altro modo significa: si tratta di campi a ricerca automatica?
    Belli da vedere, facilissimi da usare con l'autocomposizione ma pessimi per... tutto. Vedi una cosa, ne contengono un'altra. Lascia che i campi siano campi "normali", quello che poi si deve vedere lo si ottiene tramite idonee query mettendo in collegamento le tabelle coinvolte. L'inserimento si fa solo tramite maschera e creare in quelle una combobox è facilissimo. La facilità d'uso si ottiene anche seguendo le strade giuste, che non comportanto i problemi dei campi a ricerca automatica.
  • Re: Query SQL con ultimi record tra due tabelle collegate

    Grazie per la risposta Phil. Comunque, la query che mi ha corretto Biagio de Franco funziona, ma parzialmente: solo in un piccolo gruppo di persone non ho gli ultimi dati dati occupazionali. I dati sono ordinati con criterio numerico crescente (IDDatiOccupazionali) utilizzando Max e secondo la data più recente sul campo DataInizioOccupazione usando sempre MAX. Il problema è che se utilizzo altri campi nella query, appartenenti alla tabella collegata (tblDatiOccupazionali), l'eliminazione della funzione Last produce dei dati ridondanti, cioè vengono selezionate più righe della tabella relativa.
    Per quanto riguardo le caselle combinate queste vengono utilizzate esclusivamente nella maschera per l'inserimento dei dati.
  • Re: Query SQL con ultimi record tra due tabelle collegate

    franz64 ha scritto:


    Grazie per la risposta Phil. Comunque, la query che mi ha corretto Biagio de Franco funziona, ma parzialmente: solo in un piccolo gruppo di persone non ho gli ultimi dati dati occupazionali. .....
    Ciao, se riposti la query vediamo perchè funziona parzialmente.
  • Re: Query SQL con ultimi record tra due tabelle collegate

    Ho risolto anche con la funzione compatta e ripristina database. Posto la query corretta
    SELECT Last(tblDatiOccupazionali.IDDatiOccupazionali) AS UltimoDiIDDatiOccupazionali, tblAnagrafica.IDEsposto, tblAnagrafica.Cognome, tblAnagrafica.Nome, tblAnagrafica.DataNascita, tblAnagrafica.IDQualifica, Last(tblDatiOccupazionali.IDSediLavoro) AS UltimoDiIDSediLavoro, Last(tblDatiOccupazionali.IDDestinazioneLavorativa) AS UltimoDiIDDestinazioneLavorativa, Max(tblDatiOccupazionali.DataInizioOccupazione) AS MaxDiDataInizioOccupazione, Last(tblDatiOccupazionali.IDClassificazione) AS UltimoDiIDClassificazione, Last(tblDatiOccupazionali.IDStatoServizio) AS UltimoDiIDStatoServizio
    FROM tblAnagrafica RIGHT JOIN tblDatiOccupazionali ON tblAnagrafica.IDEsposto = tblDatiOccupazionali.IDEsposto
    GROUP BY tblAnagrafica.IDEsposto, tblAnagrafica.Cognome, tblAnagrafica.Nome, tblAnagrafica.DataNascita, tblAnagrafica.IDQualifica
    HAVING (((Last(tblDatiOccupazionali.IDDatiOccupazionali))=Max([tblDatiOccupazionali].[IDDatiOccupazionali])));
    grazie!
    Francesco
Devi accedere o registrarti per scrivere nel forum
6 risposte