Query Access che segnala errore - via db manager funziona

di il
31 risposte

31 Risposte - Pagina 2

  • Re: Query Access che segnala errore - via db manager funziona

    Questa funziona

    SELECT F.*, C.*
    FROM (
    (FERICEVUTE AS F LEFT JOIN FERICEVUTEBODY AS B ON F.ID_FERICEVUTE = B.ID_FERICEVUTE) 
    LEFT JOIN FERICEVUTEDATIPAG AS D ON B.ID_FERICEVUTEBODY = D.ID_FERICEVUTEBODY) 
    LEFT JOIN (FERICEVUTEHEADER AS H LEFT JOIN FERICEVUTECEDENTE AS C ON H.ID_FERICEVUTEHEADER = C.ID_FERICEVUTEHEADER) ON F.ID_FERICEVUTE = H.ID_FERICEVUTE
    WHERE D.ID_FERICEVUTEBODY IS NULL;
    
  • Re: Query Access che segnala errore - via db manager funziona

    28/03/2025 - amorosik ha scritto:

    Ah, dici che non si possa fare una left join di una left join?  Eh questa mi mancava

    Qualcuno dei presenti (o degli assenti) puo' confermare che non si possa fare?

    Certo che si può...

  • Re: Query Access che segnala errore - via db manager funziona

    28/03/2025 - sihsandrea ha scritto:

    28/03/2025 - amorosik ha scritto:

    Ah, dici che non si possa fare una left join di una left join?  Eh questa mi mancava

    Qualcuno dei presenti (o degli assenti) puo' confermare che non si possa fare?

    Certo che si può...

    E quindi come mai la mia query al post iniziale non funziona?

    Mi sembra sintatticamente corretta, e lo e' sicuramente perche' su altro db manager funziona correttamente

  • Re: Query Access che segnala errore - via db manager funziona

    Mi sembrava di aver capito che funziona...

    Mi ero fermato dal verificare.

    Esponi le tabelle in questione.

  • Re: Query Access che segnala errore - via db manager funziona

    28/03/2025 - sihsandrea ha scritto:

    Mi sembrava di aver capito che funziona...

    Mi ero fermato dal verificare.

    Esponi le tabelle in questione.

    Ci sono al post iniziale

  • Re: Query Access che segnala errore - via db manager funziona

    SELECT F.*, C.*
    FROM FERICEVUTE F
    LEFT JOIN (
        FERICEVUTEBODY B 
        LEFT JOIN FERICEVUTEDATIPAG D 
        ON B.ID_FERICEVUTEBODY = D.ID_FERICEVUTEBODY
    ) ON F.ID_FERICEVUTE = B.ID_FERICEVUTE
    LEFT JOIN (
        FERICEVUTEHEADER H 
        LEFT JOIN FERICEVUTECEDENTE C 
        ON H.ID_FERICEVUTEHEADER = C.ID_FERICEVUTEHEADER
    ) ON F.ID_FERICEVUTE = H.ID_FERICEVUTE
    WHERE D.ID_FERICEVUTEBODY IS NULL;
    SELECT F.*, C.*
    FROM ((FERICEVUTE AS F
    LEFT JOIN FERICEVUTEBODY AS B ON F.ID_FERICEVUTE = B.ID_FERICEVUTE) 
    LEFT JOIN FERICEVUTEDATIPAG AS D ON B.ID_FERICEVUTEBODY = D.ID_FERICEVUTEBODY) 
    
    LEFT JOIN (FERICEVUTEHEADER AS H LEFT JOIN FERICEVUTECEDENTE AS C ON H.ID_FERICEVUTEHEADER = C.ID_FERICEVUTEHEADER)
     ON F.ID_FERICEVUTE = H.ID_FERICEVUTE
     
    WHERE D.ID_FERICEVUTEBODY IS NULL;

    Bene che ci sei riuscito ...

    Access utilizza evidentemente una sintassi 'leggermente' diversa rispetto ad altri RDBMS quando ci sono i LEFT/RIGHT JOIN.

  • Re: Query Access che segnala errore - via db manager funziona

    L'utilizzo delle subquery (secondo caso) al posto delle left join annidate (primo caso) dovrebbe confermare che per Access le left join annidate NON si possano usare

    Ma sopra c'e'  @sihsandrea che dice si possano usare

    E quindi, forse e' ipotizzabile un problema di tipo diverso sulla mia query iniziale

  • Re: Query Access che segnala errore - via db manager funziona

    28/03/2025 - amorosik ha scritto:

    Ma sopra c'e'  @sihsandrea che dice si possano usare

    Andrea è noto per avere una sua (unica e personale) versione di Access che però custodisce gelosamente  ;-)

  • Re: Query Access che segnala errore - via db manager funziona

    MS sembra confermare (indirettamente) che non si possono annidare LEFT/RIGHT JOIN : https://learn.microsoft.com/it-it/office/client-developer/access/desktop-database-reference/left-join-right-join-operations-microsoft-access-sql

    A LEFT JOIN or a RIGHT JOIN can be nested inside an INNER JOIN, but an INNER JOIN cannot be nested inside a LEFT JOIN or a RIGHT JOIN. See the discussion of nesting in the INNER JOIN topic to see how to nest joins within other joins.

    Se non posso aggiungere un INNER JOIN a valle di un LEFT/RIGHT JOIN direi che non posso neanche aggiungere un LEFT/RIGHT JOIN ... ma è una mia interpretazione.

  • Re: Query Access che segnala errore - via db manager funziona

    Adesso non posso rispondere...

    Mi sembrava che si parlasse di firebird.

    Devi intervenire su sql.

    Quanto alle join, sembra un caso del tipo:

    Tabella nomi{idnome, tag sociale, blabla}

    Tabella indirizzi{ID indirizzo, idnome, blabla}

    Tabella contatti{idcontatto, idnome, blabla}

    Domani verifico le sql

  • Re: Query Access che segnala errore - via db manager funziona

    28/03/2025 - sihsandrea ha scritto:

    Adesso non posso rispondere...

    Mi sembrava che si parlasse di firebird.

    Devi intervenire su sql.

    Quanto alle join, sembra un caso del tipo:

    Tabella nomi{idnome, tag sociale, blabla}

    Tabella indirizzi{ID indirizzo, idnome, blabla}

    Tabella contatti{idcontatto, idnome, blabla}

    Domani verifico le sql

    Si, si parlava di Firebird

    Ringrazio per l'aiuto, ma non serve piu', ho gia' risolto con la query indicata sopra

  • Re: Query Access che segnala errore - via db manager funziona

    Per poter verificare è necessario avere a disposizione il file anche privo di dati.

  • Re: Query Access che segnala errore - via db manager funziona

    28/03/2025 - max.riservo ha scritto:

    Se non posso aggiungere un INNER JOIN a valle di un LEFT/RIGHT JOIN direi che non posso neanche aggiungere un LEFT/RIGHT JOIN ... ma è una mia interpretazione.

    La traduzione di quanto hai riportato

    Un LEFT JOIN o un RIGHT JOIN possono essere annidati all'interno di un INNER JOIN,

    Che significa?

    Dato l'insieme A di triangoli,  l'insieme b di triangoli scaleni, l'insieme c di triangoli rettangoli...

    Triangoli Left joint triangoli scaleni mostra tutto l'insieme dei triangoli e i triangoli scaleni che sono uguali nell'insieme triangoli escludendo i simili presenti nell'insieme scaleni

    Poi posso aggiungere un altro sottoinsieme preso dalla tabella rettangoli

    Triangoli Left joint rettangoli

    Fermo restando tutta la tabella o insieme triangoli, aggiungo quelli che nella tabella rettangoli sono uguali non simili a quelli della tabella triangoli

     ma un INNER JOIN non può essere annidato all'interno di un LEFT JOIN o di un RIGHT JOIN.

    E questa che significa???

    Triangoli inner joint scaleni

    Prendi solo gli scaleni della tabella triangoli che sono anche nella tabella scaleni...

    Fine! Non posso più aggiungere altre joint perché non ho altri triangoli nella tabella triangoli: qualsiasi altra joint mi restituisce l'insieme vuoto (zero).

     se non ci arriva la logica ci arriva il manuale.

    Tuttavia, 

    Se si crea una query che contiene un LEFT JOIN e un INNER JOIN, Access potrebbe non essere in grado di determinare quale operazione eseguire per prima. Poiché i risultati variano in base al tipo di join eseguito per primo, Access restituisce un messaggio di errore:

    Per risolvere il problema, è necessario modificare la query in modo che sia chiaramente indicato il join da eseguire per primo.

    Tratto da https://support.microsoft.com/it-it/topic/collegare-tabelle-e-query-3f5838bd-24a0-4832-9bc1-07061a1478f6

    tradotto significa un buon uso di parentesi.

    P.s. si può bypassare il limite innerjoin con una Union e ripetere la select... anche n volte.

  • Re: Query Access che segnala errore - via db manager funziona

    Rieccomi.

    la prima sql è composta così

    SELECT F.*, C.*
    FROM (
         (FERICEVUTE AS F LEFT JOIN FERICEVUTEBODY AS B ON F.ID_FERICEVUTE = B.ID_FERICEVUTE) 
         LEFT JOIN FERICEVUTEDATIPAG AS D ON B.ID_FERICEVUTEBODY = D.ID_FERICEVUTEBODY) 
    LEFT JOIN (FERICEVUTEHEADER AS H LEFT JOIN FERICEVUTECEDENTE AS C ON H.ID_FERICEVUTEHEADER = C.ID_FERICEVUTEHEADER) ON F.ID_FERICEVUTE = H.ID_FERICEVUTE
    WHERE D.ID_FERICEVUTEBODY IS NULL;
    
    
    estraiamo le singole sql
    sql_1=(FERICEVUTE AS F LEFT JOIN FERICEVUTEBODY AS B ON F.ID_FERICEVUTE = B.ID_FERICEVUTE) 
            master 1->>M body
    sql_2=(FERICEVUTEHEADER AS H LEFT JOIN FERICEVUTECEDENTE AS C ON H.ID_FERICEVUTEHEADER = C.ID_FERICEVUTEHEADER)
    
           detail di ricevute 1->>M cedente
    sql_3=(sql_1 LEFT JOIN FERICEVUTEDATIPAG AS D ON B.ID_FERICEVUTEBODY = D.ID_FERICEVUTEBODY)
    
           (master 1->>M body) 1->>M datipag
    sql_4=(FERICEVUTEHEADER AS H LEFT JOIN FERICEVUTECEDENTE AS C ON H.ID_FERICEVUTEHEADER = C.ID_FERICEVUTEHEADER)
    
           uguale a sql_2
    
           
    
    diventa
    SELECT F.*, C.*
    FROM (sql_1 LEFT JOIN sql_3)
    LEFT JOIN sql_4 ON F.ID_FERICEVUTE = H.ID_FERICEVUTE
    WHERE D.ID_FERICEVUTEBODY IS NULL;
       che fine ha fatto sql_2 che hai chiamato C?
       nella sql_2 FERICEVUTECEDENTE AS C
       nella sql_4 FERICEVUTECEDENTE AS C
       a quale select c.* deve fare riferimento?

    qui hai abolito la sql_4 (che era un duplicato) per usare sql_2 (C)

    SELECT F.*, C.*
    FROM FERICEVUTE F
    LEFT JOIN (FERICEVUTEBODY B 
               LEFT JOIN FERICEVUTEDATIPAG D ON B.ID_FERICEVUTEBODY = D.ID_FERICEVUTEBODY) ON F.ID_FERICEVUTE = B.ID_FERICEVUTE
    LEFT JOIN (FERICEVUTEHEADER H 
               LEFT JOIN FERICEVUTECEDENTE C ON H.ID_FERICEVUTEHEADER = C.ID_FERICEVUTEHEADER) ON F.ID_FERICEVUTE = H.ID_FERICEVUTE
    WHERE D.ID_FERICEVUTEBODY IS NULL;
  • Re: Query Access che segnala errore - via db manager funziona

    Ciao,

    errore di sintassi ? ...sembra che non siano permesse le left join annidate

    Hai provato a provare in questo modo ? (non avendo le  tabelle e i dati non posso verificarla)

    SELECT F.*, C.*
    FROM ((FERICEVUTE F
    LEFT JOIN FERICEVUTEBODY B 
    	ON F.ID_FERICEVUTE = B.ID_FERICEVUTE)
    		LEFT JOIN FERICEVUTEDATIPAG D 
    			ON B.ID_FERICEVUTEBODY = D.ID_FERICEVUTEBODY)
    				LEFT JOIN (FERICEVUTEHEADER H 
    					INNER JOIN FERICEVUTECEDENTE C 
    						ON H.ID_FERICEVUTEHEADER = C.ID_FERICEVUTEHEADER)
    						ON F.ID_FERICEVUTE = H.ID_FERICEVUTE
    WHERE D.ID_FERICEVUTEBODY IS NULL;
    
Devi accedere o registrarti per scrivere nel forum
31 risposte