Query e campo calcolato (LEFT JOIN)

di il
10 risposte

Query e campo calcolato (LEFT JOIN)

Ho questo problema che credo banale ma....
Ho due Tbl A e B con A in relazione 1 a M con B
A: idA,NumA
B: idB, NumB, ida - valore predefinito=0 proprietà campo NumB
Creo maschera A con Sottomaschera B
inserisco i dati

A1=9 ---------b1=4
---------b2=5
A2=10 ------- b3=valore predefinito=0 (in pratica non inserisco nulla)

Query di selezione
Tutti i campi di A e tutti i campi di B in modo che mi faccia visualizzare anche i record di A che non hanno corrispondenza nei record di B ( proprietà join punto 2 (Left join))
Raggruppo ed inserisco un campo calcolato: Differenza:[A]-[B]
Il risultato della query è:
A1-b1 9-4=5
A1-b2 9-5=4

A2-b3 10-0 (valore predefinito=0) = nulla (casella vuota). Io vorrei che restituisse semplicemente 10-0=10
Il problema è il LEFT JOIN che estrae tutti i valori della tabella a sinistra anche se non hanno corrispondenza nella tabella a destra, per cui come fa la query a sottrarre da A un numero che non esiste in B?
Come faccio a risolvere il problema?

10 Risposte

  • Re: Query e campo calcolato (LEFT JOIN)

    zonevinc ha scritto:


    ...
    inserisco i dati
    ...
    A2=10 ------- b3=valore predefinito=0 (in pratica non inserisco nulla)
    Secondo me bisogna fare un po' di chiarezza su questo aspetto: zero non è nulla, zero è comunque un valore. C'è lo zero presente nella tabella?

    zonevinc ha scritto:


    ...A2-b3 10-0 (valore predefinito=0) = nulla (casella vuota). Io vorrei che restituisse semplicemente 10-0=10
    Il problema è il LEFT JOIN che estrae tutti i valori della tabella a sinistra anche se non hanno corrispondenza nella tabella a destra, per cui come fa la query a sottrarre da A un numero che non esiste in B?
    Il problema con il LEFT JOIN dovresti averlo nel momento in cui non c'è alcun record nella tabella B associato ad A2, non quando ci sono ma hanno comunque somma zero. Ed ecco che torno a chiedere se lo zero c'è o no nella tabella.
    Per i veri record della tabella A che non hanno corrispondenze in B, comunque, credo che con un Nz() si risolva tutto.
    Posta anche la query che vediamo.
  • Re: Query e campo calcolato (LEFT JOIN)

    Philcattivocarattere anche a me la cosa è sembrata strana però accade quello che ho raccontato
    Per i veri record della tabella A che non hanno corrispondenze in B, comunque, credo che con un Nz() si risolva tutto.
    Posta anche la query che vediamo.
    Bhe, non so cosa sia un Nz() ma ricostruisco l'esempio e lo posto.
    La query e:
    SELECT A.IDA AS A_IDA, A.A, B.IDB, B.B, B.ida AS B_ida, [A]-[B] AS Diff
    FROM A LEFT JOIN B ON A.[IDA] = B.[ida]
    GROUP BY A.IDA, A.A, B.IDB, B.B, B.ida;

    Ho postato anche la tab B e l'esecuzione della query dove si vede che quest'ultima non restituisce alcun risultato nel campo calcolato "Diff" (x me doveva essere 10-0=10)

    Un saluto e un grazie

    Allegati:
    17466_ddf40f260d55628070e071a8e928ada9.jpg
    17466_ddf40f260d55628070e071a8e928ada9.jpg

    17466_792a766a217cab83e98c63e1727b938f.jpg
    17466_792a766a217cab83e98c63e1727b938f.jpg

    17466_3b3beb4e2a7b31eeecb9798a55989ce9.jpg
    17466_3b3beb4e2a7b31eeecb9798a55989ce9.jpg
  • Re: Query e campo calcolato (LEFT JOIN)

    zonevinc ha scritto:


    ...
    Ho postato anche la tab B e l'esecuzione della query dove si vede che quest'ultima non restituisce alcun risultato nel campo calcolato "Diff" (x me doveva essere 10-0=10)
    Domanda terra terra: ci sono record nella tabella B che hanno ida = 5?
    Se la risposta è sì... mi cadono parecchie certezze. Se la risposta è no... ne riparliamo.
    Funzione Nz() Nz Function
  • Re: Query e campo calcolato (LEFT JOIN)

    Domanda terra terra: ci sono record nella tabella B che hanno ida = 5?
    No.

    Io sono un neofita di access però credo di intuire che il problema sia proprio nel LEFT JOIN che, se è vero che estrae i valori della tabella madre che non hanno corrispondenti nella tabella figlia, significa che non ci sono corrispondenti e quindi neppure lo zero.
    Da ciò deduco che se non ho corrispondenti nella Tab B significa che seppur indico un valore predefinito nella tabella B (che può essere 0,10 o 200), questo valore, finquando non sarà confermato, non avrà un IDB => la query, correttamente, non lo vede xchè, effettivamente, non c'è.
  • Re: Query e campo calcolato (LEFT JOIN)

    Funzione Nz() Nz Function
    Nz Function [Access 2003 VBA Language Reference]
    Ho letto un pochino. Non conosco il VBA per cui non saprei come fare praticamente. credo pero sia la soluzione. Nel senso che se il valore è nullo
    " La Nz funzione è utile per le espressioni che possono includere Null valori. Per forzare un espressione da valutare ad un non Null valore anche quando contiene un Null valore, utilizzare la Nz funzione per restituire zero, una stringa di lunghezza zero, o un valore di ritorno personalizzato
    .
    si forza a un Non Null (nel mio caso zero) ed in pratica è come se trasformassi, dall'altro lato, il LEFT JOIN in un INNER JOIN
  • Re: Query e campo calcolato (LEFT JOIN)

    zonevinc ha scritto:


    ... il problema sia proprio nel LEFT JOIN che, se è vero che estrae i valori della tabella madre che non hanno corrispondenti nella tabella figlia, significa che non ci sono corrispondenti e quindi neppure lo zero.
    Da ciò deduco che se non ho corrispondenti nella Tab B significa che seppur indico un valore predefinito nella tabella B (che può essere 0,10 o 200), questo valore, finquando non sarà confermato, non avrà un IDB => la query, correttamente, non lo vede xchè, effettivamente, non c'è.
    Adesso ci sei, ora puoi mettere in azione la funzione Nz().

    zonevinc ha scritto:


    ... si forza a un Non Null (nel mio caso zero)
    Bene

    zonevinc ha scritto:


    ...ed in pratica è come se trasformassi, dall'altro lato, il LEFT JOIN in un INNER JOIN
    questo toglitelo dalla testa, non usarlo nemmeno come "modo di esprimerti tuo" in attesa di acquisire maggiore padronanza. Il LEFT JOIN rimane tale, con le sue caratteristiche. Applicare Nz() al campo B nella query con raggruppamento permette solo di eseguire le operazioni che la presenza del Null impedisce per la sua peculiarità: la propagazione (come quel pugile del film: "quello che lui tocca, lui rende Null")
    Ovunque appare il campo B scrivi
    Nz([B].[B];"0") As CampoB
    e con evenutali aggiustamenti in corso d'opera (sto andando a memoria, non ho provato questo caso specifico) il risultato arriva.
    Anche se questo è sicuramente solo un esempio della tua situazione da sottoporre al forum, in futuro evita l'uso di nomi di tabelle e di campi così "generico": con A e B che sono sia nomi di tabella sia nomi di campo non ci capivo niente.
  • Re: Query e campo calcolato (LEFT JOIN)

    in futuro evita l'uso di nomi di tabelle e di campi così "generico": con A e B che sono sia nomi di tabella sia nomi di campo non ci capivo niente.
    mi perdevo anch'io rileggendola - Hai ragione scusami

    Nz([B].[B];"0") As CampoB
    [/b]

    Ho rifatto le due tbl - e vabbè (mi sono venute cosi) le ho chiamate Alfa e Beta giusto per --- Ho rifatto la query con proc. guidata ed è questa:

    SELECT Alfa.IDAlfa, Alfa.AlfaNum, Beta.IDBeta, Beta.BetaNum, Beta.idalfa, [AlfaNum]-[BetaNum] AS Diff
    FROM Alfa LEFT JOIN Beta ON Alfa.IDAlfa = Beta.idalfa
    GROUP BY Alfa.IDAlfa, Alfa.AlfaNum, Beta.IDBeta, Beta.BetaNum, Beta.idalfa;

    e l'ho modificata cosi
    SELECT Alfa.IDAlfa, Alfa.AlfaNum, Beta.IDBeta, Beta.BetaNum, Beta.idalfa, Nz([AlfaNum],0)-Nz([BetaNum],0) AS Diff
    FROM Alfa LEFT JOIN Beta ON Alfa.IDAlfa = Beta.idalfa
    GROUP BY Alfa.IDAlfa, Alfa.AlfaNum, Beta.IDBeta, Beta.BetaNum, Beta.idalfa;
    e....
    Funziona!!seppur ho inserito Nz ai due campi (basta solo quello di B (verificato))
    Nz([B].[B];"0") As CampoB
    Scrivendola cosi
    AlfaNum-Nz([B].[BetaNum];"0") AS Diff
    mi da un errore di sintassi - perchè? e xchè lo zero va messo tra virgolette?
    Togliendo il ; e scrivendo
    [AlfaNum]-Nz([B].[BetaNum],"0") AS Diff

    FUNziona - Risolto problema e.... imparato tanto

    Grazie
  • Re: Query e campo calcolato (LEFT JOIN)

    [quote][/quote]questo toglitelo dalla testa, non usarlo nemmeno come "modo di esprimerti tuo" in attesa di acquisire maggiore padronanza. Il LEFT JOIN rimane tale, con le sue caratteristiche.
    Infatti nella Tab Beta non mi ha aggiunto alcun IDBeta al campo della Tab Alfa che non ha corrispondenti in Beta (forse mi sarei sentito piu tranquillo se l'avesse fatto)
  • Re: Query e campo calcolato (LEFT JOIN)

    zonevinc ha scritto:


    ...
    Scrivendola cosi
    AlfaNum-Nz([B].[BetaNum];"0") AS Diff
    mi da un errore di sintassi - perchè? e xchè lo zero va messo tra virgolette?
    Togliendo il ; e scrivendo
    [AlfaNum]-Nz([B].[BetaNum],"0") AS Diff
    Dipende da dove si scrivi, se direttamente in QBE o da SQL. Comunque lo immaginavo che fossero necessari alcuni aggiustamenti di "sintassi" (andavo a memoria, quando poi le uso davvero non le indovino al primo colpo, quasi mai) ed è importante che tu ci sia riuscito da solo, senza ricorrere immediatamente al forum.
  • Re: Query e campo calcolato (LEFT JOIN)

    Ho inserito la funzione Nz() all'interno di alcune query (fatture query scadute e in scadenza) che mi restituiscono i residui (Diff) dei pagamenti effettuati ho da effettuare ( Left join) per ogni scadenza relativa alla singola/molte fattura/e emesse dai vari fornitori.
    Ora il residuo (differenza) .... Funzione

    Grazie Ancora
Devi accedere o registrarti per scrivere nel forum
10 risposte