Condividi tramite

Query di unione - Errore di sintassi nella clausola FROM

Anonimo
2019-08-21T20:48:14+00:00

Ho un problema con una query di UNIONE, la query infatti restituisce il messaggio: "Errore di sintassi nella clausola FROM". La cosa assurda è che se eseguo la query con solo due unioni, non da alcun problema, ma non appena aggiungo la terza...

Riporto di seguito la query:

SELECT Matricola, Cognome, Nome, CF, DataDiNascita, DataDiAssunzione,"" AS DataCorso, "SFAR" AS Co, "PE" AS TCo, Date() AS DataScadenza

FROM qryNOPEA

UNION

SELECT Matricola, Cognome, Nome, CF, DataDiNascita, DataDiAssunzione,"","SFAR", "PE", Date()

FROM qryNOPEACT

UNION SELECT Matricola, Cognome, Nome, CF, DataDiNascita, DataDiAssunzione,"","SFAnt", "PE", Date()

FROM qryNOPEAnt;

Grazie mille e buona giornata a tutti

Microsoft 365 e Office | Access | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

11 risposte

Ordina per: Più utili
  1. Anonimo
    2019-08-22T20:03:34+00:00

    ciao Lino,

    non ho controllato la faccenda dei dati non corrispondenti ma ho preso le singole queries ed unite in una sola con il predicato che segue :

    SELECT tblPersonale.Matricola, tblPersonale.Cognome, tblPersonale.Nome, tblPersonale.CF, tblPersonale.DataDiNascita, tblPersonale.DataDiAssunzione, tblPersonale.Licenziato_Dimissionario

    FROM tblPersonale LEFT JOIN qryELFOPEAltoRischio ON tblPersonale.Matricola = qryELFOPEAltoRischio.Matricola

    WHERE (((tblPersonale.Licenziato_Dimissionario)=False) AND ((tblPersonale.CorsiObbligatori.Value)=12) AND ((qryELFOPEAltoRischio.Matricola) Is Null))

    union all

    SELECT tblPersonale.Matricola, tblPersonale.Cognome, tblPersonale.Nome, tblPersonale.CF, tblPersonale.DataDiNascita, tblPersonale.DataDiAssunzione,  tblPersonale.Licenziato_Dimissionario

    FROM tblPersonale LEFT JOIN qryELFOPEAltoRischioCT ON tblPersonale.Matricola = qryELFOPEAltoRischioCT.Matricola

    WHERE (((tblPersonale.Licenziato_Dimissionario)=False) AND ((tblPersonale.CorsiObbligatori.Value)=2) AND ((qryELFOPEAltoRischioCT.Matricola) Is Null));

    union all

    SELECT tblPersonale.Matricola, tblPersonale.Cognome, tblPersonale.Nome, tblPersonale.CF, tblPersonale.DataDiNascita, tblPersonale.DataDiAssunzione,  tblPersonale.Licenziato_Dimissionario

    FROM tblPersonale LEFT JOIN qryELFOPEAntincendio ON tblPersonale.Matricola = qryELFOPEAntincendio.Matricola

    WHERE (((tblPersonale.Licenziato_Dimissionario)=False) AND ((tblPersonale.CorsiObbligatori.Value)=7) AND ((qryELFOPEAntincendio.Matricola) Is Null))

    l'unica differenza è che ho eliminato dai campi estratti nelle singole queries il MVF ( campo multivalore ) nominato corsiObbligatori.

    I campi MVF sono da evitare come la peste, spesso mi sono ripetuto in questo forum in tal senso e a maggior ragione lo sono perché by design sono si possono utilizzare nelle queries di unione.

    Ci sono una miriadi di altre motivazione per evitare di utilizzarli, e prediligere la classica relazione 1--->M, cosa che ti consiglio di attuare, normalizzando la tabella prima di incappare in altri problemi...

    Per riprodurre il messaggio di errore, copia incolla questo predicato è completo e comprensivo del campo incriminato :

    SELECT tblPersonale.Matricola, tblPersonale.Cognome, tblPersonale.Nome, tblPersonale.CF, tblPersonale.DataDiNascita, tblPersonale.CorsiObbligatori, tblPersonale.DataDiAssunzione, tblPersonale.Licenziato_Dimissionario

    FROM tblPersonale LEFT JOIN qryELFOPEAltoRischio ON tblPersonale.Matricola = qryELFOPEAltoRischio.Matricola

    WHERE (((tblPersonale.Licenziato_Dimissionario)=False) AND ((tblPersonale.CorsiObbligatori.Value)=12) AND ((qryELFOPEAltoRischio.Matricola) Is Null));

    union all

    SELECT tblPersonale.Matricola, tblPersonale.Cognome, tblPersonale.Nome, tblPersonale.CF, tblPersonale.DataDiNascita, tblPersonale.DataDiAssunzione, tblPersonale.CorsiObbligatori, tblPersonale.Licenziato_Dimissionario

    FROM tblPersonale LEFT JOIN qryELFOPEAltoRischioCT ON tblPersonale.Matricola = qryELFOPEAltoRischioCT.Matricola

    WHERE (((tblPersonale.Licenziato_Dimissionario)=False) AND ((tblPersonale.CorsiObbligatori.Value)=2) AND ((qryELFOPEAltoRischioCT.Matricola) Is Null))

    union all

    SELECT tblPersonale.Matricola, tblPersonale.Cognome, tblPersonale.Nome, tblPersonale.CF, tblPersonale.DataDiNascita, tblPersonale.DataDiAssunzione, tblPersonale.CorsiObbligatori, tblPersonale.Licenziato_Dimissionario

    FROM tblPersonale LEFT JOIN qryELFOPEAntincendio ON tblPersonale.Matricola = qryELFOPEAntincendio.Matricola

    WHERE (((tblPersonale.Licenziato_Dimissionario)=False) AND ((tblPersonale.CorsiObbligatori.Value)=7) AND ((qryELFOPEAntincendio.Matricola) Is Null));

    Facci sapere.

    Ciao, Sandro.

    La risposta è stata utile?

    1 persona ha trovato utile questa risposta.
    0 commenti Nessun commento
  2. Anonimo
    2019-08-22T07:28:39+00:00

    il motivo per il quale cerco di unire più query è che sono di tipo ricerca dati non corrispondenti, cosa che non riesco ad eseguire direttamente nella query di unione...

    Dato che si tratta di un DB di formazione sicurezza devo verificare se è stata eseguita la formazione di prima emissione e non ho trovato altro modo che singole query corso su corso...

    La sintassi invece ottenuta da copia incolla è la seguente:

    SELECT qryNOPEAltoRischio.Matricola, qryNOPEAltoRischio.Cognome, qryNOPEAltoRischio.Nome, qryNOPEAltoRischio.CF, qryNOPEAltoRischio.DataDiNascita, qryNOPEAltoRischio.DataDiAssunzione

    FROM qryNOPEAltoRischio

    UNION ALL

    SELECT qryNOPEAntincendio.Matricola, qryNOPEAntincendio.Cognome, qryNOPEAntincendio.Nome, qryNOPEAntincendio.CF, qryNOPEAntincendio.DataDiNascita, qryNOPEAntincendio.DataDiAssunzione

    FROM qryNOPEAntincendio

    UNION ALL

    SELECT qryNOPECarrelliEleva.Matricola, qryNOPECarrelliEleva.Cognome, qryNOPECarrelliEleva.Nome, qryNOPECarrelliEleva.CF, qryNOPECarrelliEleva.DataDiNascita, qryNOPECarrelliEleva.DataDiAssunzione

    FROM qryNOPECarrelliEleva;

    L'errore presentato è sempre lo stesso.

    Nel caso tu non abbia info a sufficienza potresti dirmi esattamente quello che ti posso inoltrare per completarle?

    Di nuovo grazie mille e buona giornata,

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2019-08-22T06:00:52+00:00

    ciao Lino,

    […]

    Grazie mille per la risposta. 

    […]

    prego.

    […]

    Perché proprio la qryNOPEAnt?

    […]

    beh, se ci dici che è con l'union della terza query si presenta il problema ho supposto che la terza fosse proprio quella citata.

    […]

    Ho provato inoltre ad unire le query (che singolarmente o a coppie funzionano) copiando direttamente il codice Sql generato da Access stesso, ma esce sempre lo stesso messaggio di errore.

    […]

    senza vedere i predicati nella loro interezza non si possono suggerire altre soluzioni a mio avviso.

    Prova a mostrare i dettagli dei predicato che interagiscono nella union.

    Inoltre, personalmente non mi piaccio troppo le query con sottoQuery, qui, oltre ad avere sottoqueries, sembra che tu debba estrarre sempre le stesse colonne...mi fa un po' strano, ma come detto le info a disposizione sono troppo esigue.

    Attendiamo news.

    ciao, Sandro.

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2019-08-21T21:38:16+00:00

    Grazie mille per la risposta. 

    Perché proprio la qryNOPEAnt?

    Comunque dato che dovrei unire molte query ho provato a sostituirla con un altra ma il problema persiste...

    Ho provato inoltre ad unire le query (che singolarmente o a coppie funzionano) copiando direttamente il codice Sql generato da Access stesso, ma esce sempre lo stesso messaggio di errore.

    Ciao,

    Lino

    La risposta è stata utile?

    0 commenti Nessun commento
  5. Anonimo
    2019-08-21T21:08:19+00:00

    ciao Lino,

    valuta per una questione di performance union all al posto di union se applicabile.

    Per quanto al quesito mi viene da suggerirti di controllare la query qryNOPEAnt,  forse è quello il problema.

    Facci sapere.

    Ciao, Sandro.

    La risposta è stata utile?

    0 commenti Nessun commento