none
JOIN con doppio ON RRS feed

  • Domanda

  • Mi capita di trovare istruzioni SELECT che nella JOIN hanno due volte ON con campi differenti e magari anche di table diverse da quella in JOIN. Come funziona la JOIN in questi casi ?

    Esempio:

    SELECT dbo.Magmov.DtaDocum,
                dbo.Magmov.NumDocum

    FROM dbo.Anagrafe

    INNER JOIN dbo.TestaOrdAfo ON dbo.Anagrafe.TipoAna = dbo.TestaOrdAfo.TipoAna AND
                                                    dbo.Anagrafe.Cd_Ana = dbo.TestaOrdAfo.cd_Ana

    INNER JOIN dbo.MOVMAG_DETT

    INNER JOIN dbo.OrdineDettC ON dbo.MOVMAG_DETT.NrOrdine = dbo.OrdineDettC.NOrdine AND
                                                     dbo.MOVMAG_DETT.NrRiga = dbo.OrdineDettC.NRiga

    INNER JOIN dbo.OrdAfo ON dbo.OrdineDettC.NOrdine = dbo.OrdAfo.NOrdCli AND
                                             dbo.OrdineDettC.NRiga = dbo.OrdAfo.NRigaCli AND
                                             dbo.OrdineDettC.Cd_Artico = dbo.OrdAfo.Cd_Artico AND
                                             dbo.OrdineDettC.Cd_Cartell = dbo.OrdAfo.Cd_Cart AND
                                             dbo.OrdineDettC.Cd_Colore = dbo.OrdAfo.Cd_Colore
                                       ON dbo.TestaOrdAfo.NumOrd = dbo.OrdAfo.Numord

    INNER JOIN dbo.Magmov ON dbo.OrdAfo.Id = dbo.Magmov.Id_Ordafo

    venerdì 26 giugno 2020 12:44

Risposte

  • Ciao,

    mi chiedevo che versione di sql stessi utilizzando dal momento che quella scrittura dovrebbe generare un syntax error.

    Ad ogni modo, in generale, puoi vedere le condizioni espresse da tutte le ON delle INNER JOIN come se fossero "spostate" nella where condition; ciascuna di esse di fatto esprime un vincolo che il dataset finale deve onorare, a tutti gli effetti come i vincoli espressi della clusola Where.

    Le versioni iniziali dello standard SQL non disponevano della sintassi [inner|left|right|full] JOIN ... ON .. e le tabelle venivano semplicemente enumerate nella FROM separandole con virgola:

    SELECT ...
    FROM Anagrafe,dbo.TestaOrdAfo, dbo.MOVMAG_DETT, dbo.OrdineDettC, dbo.OrdAfo, dbo.Magmov

    Le condizioni di JOIN venivano quindi tutte riportate nella Where condition, insieme alle eventuali altri condizioni di filtro:

    WHERE
    dbo.Anagrafe.TipoAna = dbo.TestaOrdAfo.TipoAna 
    AND dbo.Anagrafe.Cd_Ana = dbo.TestaOrdAfo.cd_Ana
    AND dbo.MOVMAG_DETT.NrOrdine = dbo.OrdineDettC.NOrdine 
    AND dbo.MOVMAG_DETT.NrRiga = dbo.OrdineDettC.NRiga												
    AND dbo.OrdineDettC.NOrdine = dbo.OrdAfo.NOrdCli 
    AND dbo.OrdineDettC.NRiga = dbo.OrdAfo.NRigaCli 
    AND dbo.OrdineDettC.Cd_Artico = dbo.OrdAfo.Cd_Artico 
    AND dbo.OrdineDettC.Cd_Cartell = dbo.OrdAfo.Cd_Cart 
    AND dbo.OrdineDettC.Cd_Colore = dbo.OrdAfo.Cd_Colore
    AND dbo.TestaOrdAfo.NumOrd = dbo.OrdAfo.Numord												 
    AND dbo.OrdAfo.Id = dbo.Magmov.Id_Ordafo								   

    Questa sintassi basata sulla WHERE è ancora molto utilizzata, p.es. in ambito Oracle.

    La sintassi più recente, se correttamente utilizzata, porta ad una migliore leggibilità degli statement in quanto esplicita le relazioni a coppie e per ciascuna di esse evidenza le specifiche condizioni sui campi; la precedente è più difficile da leggere e non separa i criteri di join da quelli più propriamente di filtro.

    G.

    venerdì 26 giugno 2020 17:08