Trovare record non corrispondenti tra due tabelle

di il
8 risposte

Trovare record non corrispondenti tra due tabelle

Buona sera.
Ho due tabelle:
Una contiene le anagrafiche del personale [Personale], l'altra contiene i dati dei documenti personali in possesso di ciascun dipendente (patente, tessera di servizio,...) [Documenti].
In entrambe le tabelle è presente la matricola di ciascun dipendente, che nella tabella [Personale] è la chiave primaria
Sto cercando di creare una query che mi visualizzi, ad esempio, tra il personale che non è stato trasferito od andato in pensione, chi non è in possesso del documento denominato "ATE".
La query che ho predisposto è la seguente:
SELECT Personale.CIP, Personale.Nominativo, Personale.Reparto, Personale.Trasf_Cong, Documenti.TipoDoc
FROM Personale LEFT JOIN Documenti ON Personale.[CIP] = Documenti.[CIP]
WHERE (((Personale.Trasf_Cong)=No) AND ((Documenti.CIP) Is Null) AND ((Documenti.TipoDoc)="ATE"));

la quale non restituisce nessun risultato
Docum.JPG
Docum.JPG

8 Risposte

  • Re: Trovare record non corrispondenti tra due tabelle

    Se CIP (Personale) è la chiave primaria e CIP (Documenti) è la FK perchè il LEFT JOIN?
    Oppure se filtri per Documenti.CIP is null, la seguente condizione Documenti.TipoDoc = 'ATE' (in AND) farà si che tu non abbia mai record !
  • Re: Trovare record non corrispondenti tra due tabelle

    Diciamo che la query che ho pubblicato, è il risultato dell'autocomposizione di Access, che funziona bene se non applico l'ulteriore filtro relativo al tipo del documento.
    Prima della mia modifica, restituiva correttamente l'elenco dei dipendenti che non avevano nessun documento
    Così non rispondeva alla mia esigenza.
    Quest'ultimo l'ho aggiunto io, nel tentativo di affinare ulteriormente la ricerca, riferendola ad un singolo documento...
    Ovviamente il mio intervento non è corretto...
  • Re: Trovare record non corrispondenti tra due tabelle

    Rileggi la tua descrizione:

    Robpagna ha scritto:


    Sto cercando di creare una query che mi visualizzi, ad esempio, tra il personale che Sto cercando di creare una query che mi visualizzi, ad esempio, tra il personale che non è stato trasferito od andato in pensione, chi non è in possesso del documento denominato "ATE"., chi non è in possesso del documento denominato "ATE".
    e noterai che indichi "... che non è stato trasferito OD andato in pensione ..." che si traduce in OR e non con AND (come ti aveva già fatto notare Max.Riservo).
  • Re: Trovare record non corrispondenti tra due tabelle

    Il "trasferito od andato in pensione" viene valorizzato dalla medesima casella di controllo (Sì/No); identifica semplicemente se la persona è ancora gestita dall'azienda oppure no. (nessun AND-OR. Il valore è: In servizio Sì/No. Infatti avevo predisposto come filtro "(Personale.Trasf_Cong)=No)"
    Per manifesta mia incompetenza, non riesco a comprendere i riferimenti agli OR che avete indicato.
    Il quesito al quale cerco risposta è : Elenca il personale in servizio AND che non è in possesso del documento denominato "ATE".
    l'utilizzo dell' OR, francamente non l'avevo neanche ipotizzato...
    Come detto sopra mi sono affidato all'autocomposizione della query a campi non corrispondenti, pensando che mi avvicinasse alla soluzione, ma evidentemente l'introduzione di un ulteriore elemento di filtro da me richiesto (tipo documento) rende l'approccio complessivamente sbagliato, credo anche nell'utilizzo del filtro "(Documenti.CIP) Is Null".
    Di certo non ho capito come tradurre correttamente il mio quesito alla query, motivo per il quale sto scrivendo su questo forum
  • Re: Trovare record non corrispondenti tra due tabelle

    Quando non ti raccapezzi con query relativamente complesse, consiglio di spezzettare tutto il discorso su più query. Lancio 2 ipotesi:
    A) Query1 filtra le Persone non in servizio. Query2 ricerca dati non corrispondenti basandosi su Query1.
    B) Query3 ricerca dati non corrispondenti. Query4 filtra le Persone non in servizio basandosi su Query4.

    N.B.: Ho usato le deniminazioni Query1-2-3-4 solo per non confondere le idee tra le 2 ipotesi.
  • Re: Trovare record non corrispondenti tra due tabelle

    Ringrazio anche Osvaldo per il suo intervento.
    Sicuramente ho frainteso, ma il filtro che a me interessa maggiormente sulla query è sul tipo di un documento specifico. Non sul servizio attivo.
    A me potrebbe interessare, ad esempio, sapere chi non ha la patente, per determinare la fattibilità di un eventuale incarico da attribuire...
    Potrei accettare il risultato da me cercato, anche senza tenere conto della presenza in servizio o meno (già ottimo risultato); questo è un aspetto che in questa fase è secondario.
    Il numero delle persone sarebbe scarso su qualsiasi tipo di documento considerato.
    Poi vediamo eventualmente di affinare ulteriormente tenendo conto anche di questo...
  • Re: Trovare record non corrispondenti tra due tabelle

    Robpagna ha scritto:


    ...In entrambe le tabelle è presente la matricola di ciascun dipendente, che nella tabella [Personale] è la chiave primaria
    Sto cercando di creare una query che mi visualizzi, ad esempio, tra il personale che non è stato trasferito od andato in pensione, chi non è in possesso del documento denominato "ATE".
    La query che ho predisposto è la seguente:
    SELECT Personale.CIP, Personale.Nominativo, Personale.Reparto, Personale.Trasf_Cong, Documenti.TipoDoc
    FROM Personale LEFT JOIN Documenti ON Personale.[CIP] = Documenti.[CIP]
    WHERE (((Personale.Trasf_Cong)=No) AND ((Documenti.CIP) Is Null) AND ((Documenti.TipoDoc)="ATE"));
    

    la quale non restituisce nessun risultato
    Come ha già cercato di spiegarti max.riservo se "CIP" è la chiave primaria della tabella "Personale" ovviamente non potrà mai essere nulla e, pertanto, se, nella query, relazioni le due tabelle con il LEFT.JOIN non avrai nessun risultato.
    Prova ad eliminare la relazione
    SELECT Personale.CIP, Personale.Nominativo, Personale.Reparto, Personale.Trasf_Cong, Documenti.TipoDoc
    FROM Personale, Documenti
    WHERE (((Personale.Trasf_Cong)=False) AND ((Documenti.TipoDoc)="ATE"));
    
  • Re: Trovare record non corrispondenti tra due tabelle

    Ringrazio anche Ettore per l'attenzione
    La query che hai postato (alla quale ho inserito "DISTINCT" perché restituiva 32000 risultati), visualizza il personale che è effettivamente in possesso del documento ricercato.
    A me serve invece sapere chi non ce l'ha

    [edit]
    Anzi...
    La query postata, riporta tutto il personale "effettivo", con "ATE" riportato nel campo del documento, indipendentemente dall'effettivo possesso!

    [EDIT1]
    dopo aver googlato un pò, e dopo svariati tentativi ed aggiustamenti, pare che così funziona (devo verificare bene il risultato):
    SELECT Personale.CIP, Personale.Nominativo, Personale.Reparto, Personale.Trasf_Cong
    FROM Personale
    WHERE (((Personale.CIP) Not In (select CIP FROM (SELECT Personale.CIP, Personale.Nominativo, Personale.Reparto, Personale.Trasf_Cong, Documenti.TipoDoc
    FROM Personale LEFT JOIN Documenti ON Personale.[CIP] = Documenti.[CIP]
    WHERE (((Documenti.TipoDoc)="ATE"))))) AND ((Personale.Trasf_Cong)=No))
    ORDER BY Personale.Reparto;
    
    Grazie a tutti
Devi accedere o registrarti per scrivere nel forum
8 risposte