Consiglio su select

di il
7 risposte

Consiglio su select

Salve,
ho 2 tabelle GIACENZE(GIACENZE) e ORDINI DI LAVORO(ODL) e vorrei legare i codici articoli presenti in giacenza con il numero dell'ordine che contiene il codice, non è detto che tutti i codici in giacenza siano presenti negli ordini di lavoro.
Nella tabella delle giacenze(GIACENZE), posso avere più record con lo stesso codice articolo con qta = 1 la discriminante è il lotto che è univoco.
Nella tabella ordini di lavoro(ODL) posso avere più record con lo stesso codice articolo con numero di ordine differente, su questa tabella non ho il lotto.

Ho provato effettuando delle join ma non riesco a rappresentare come voglio il dato, chiedo aiuto per avere un'esempio di 'select' in modo che l'output venga rappresentato in questa maniera:

CODICE ARTICOLO-| LOTTO | ORDINE

ART1 ----------------| LOTTO1| ODL1
ART1 ----------------| LOTTO2| ODL2
ART1 ----------------| LOTTO3| ODL3
ART1 ----------------| LOTTO4|
ART1 ----------------| LOTTO5|


Spero di essere stato chiaro.

Grazie

7 Risposte

  • Re: Consiglio su select

    Questa è la sezione dedicata alla "Progettazione database". Quale applicazione usi?
  • Re: Consiglio su select

    Nel linguaggio SQL, vedi l'operazione di LEFT JOIN per la SELECT:
    https://www.w3schools.com/sql/sql_join_left.as
    https://www.tutorialspoint.com/sql/sql-left-joins.ht
  • Re: Consiglio su select

    OsvaldoLaviosa ha scritto:


    Questa è la sezione dedicata alla "Progettazione database". Quale applicazione usi?
    L'applicativo è su AS400 Il database è IBM DB2.
  • Re: Consiglio su select

    willy55 ha scritto:


    Nel linguaggio SQL, vedi l'operazione di LEFT JOIN per la SELECT:
    https://www.w3schools.com/sql/sql_join_left.as
    https://www.tutorialspoint.com/sql/sql-left-joins.ht
    Si avevo già provato, però non ottengo il risultato sperato.
    Faccio un'esempio della mia situazione:

    Select sulle giacenze:

    SELECT CODART,LOTTO
    FROM GIACENZE
    WHERE GIACENZE.CODART = '02622882-03282'

    Output

    CODART------------| LOTTO
    02622882-03282--| 9000002246
    02622882-03282--| 9000002247
    02622882-03282--| 9000002248
    02622882-03282--| 9000002249
    02622882-03282--| 9000002250
    02622882-03282--| 9000002259
    02622882-03282--|


    Select sugli ordini

    SELECT CODART,NUMORD
    FROM ORDINI
    WHERE ORDINI.CODART = '02622882-03282'

    Output

    CODART------------| NUMORD
    02622882-03282--| 9914900020
    02622882-03282--| 9914900010


    PROVA CON LEFT JOIN

    SELECT CODART,LOTTO,NUMORD
    FROM GIACENZE
    LEFT JOIN ORDINI ON ORDINI.CODART = GIACENZE.CODART
    WHERE GIACENZE.CODART = '02622882-03282'

    Output

    CODART------------| LOTTO--------| NUMORD
    02622882-03282--| 9000002246--| 9914900020
    02622882-03282--| 9000002246--| 9914900010
    02622882-03282--| 9000002247--| 9914900020
    02622882-03282--| 9000002247--| 9914900010
    02622882-03282--| 9000002248--| 9914900020
    02622882-03282--| 9000002248--| 9914900010
    02622882-03282--| 9000002249--| 9914900020
    02622882-03282--| 9000002249--| 9914900010
    02622882-03282--| 9000002250--| 9914900020
    02622882-03282--| 9000002250--| 9914900010
    02622882-03282--| 9000002259--| 9914900020
    02622882-03282--| 9000002259--| 9914900010
    02622882-03282--| ----------------| 9914900020
    02622882-03282--| ----------------| 9914900010


    INVECE IL RISULTATO CHE VORREI E' IL SEGUENTE :

    CODART------------| LOTTO--------| NUMORD
    02622882-03282--| 9000002246--| 9914900010
    02622882-03282--| 9000002247--| 9914900020
    02622882-03282--| 9000002248--| ----------------
    02622882-03282--| 9000002249--| ----------------
    02622882-03282--| 9000002250--| ----------------
    02622882-03282--| 9000002259--| ----------------
    02622882-03282--| ----------------| ----------------
  • Re: Consiglio su select

    La tua selezione dei dati si basa sulla condizione WHERE ove il 'CODART', delle due tabelle, è pari a '02622882-03282'; ma ciò non è sufficiente ad identificare univocamente la relazione (fra le tabelle stesse) con conseguente effetto moltiplicativo della JOIN.
    Per sopperire ciò, puoi impiegare la funzione ROW_NUMBER() (o similare) che conteggi le occorrenze di ciascuna tabella (nell'ordine da te voluto) e poi ponga in relazione le due tabelle, inserendo questo ulteriore elemento discriminante (al fine di non avere il prodotto cartesiano delle occorrenze, ove gli elementi della prima tabella sono combinati con ogni elemento della seconda).
    Leggi questi documenti:
    https://www.sqlservercentral.com/forums/topic/select-columns-from-different-tables-without-join
    http://www.drowningintechnicaldebt.com/ShawnWeisfeld/archive/2009/07/03/using-row-number-to-eliminate-the-multiplicative-effects-of-a.aspx
  • Re: Consiglio su select

    willy55 ha scritto:


    La tua selezione dei dati si basa sulla condizione WHERE ove il 'CODART', delle due tabelle, è pari a '02622882-03282'; ma ciò non è sufficiente ad identificare univocamente la relazione (fra le tabelle stesse) con conseguente effetto moltiplicativo della JOIN.
    Per sopperire ciò, puoi impiegare la funzione ROW_NUMBER() (o similare) che conteggi le occorrenze di ciascuna tabella (nell'ordine da te voluto) e poi ponga in relazione le due tabelle, inserendo questo ulteriore elemento discriminante (al fine di non avere il prodotto cartesiano delle occorrenze, ove gli elementi della prima tabella sono combinati con ogni elemento della seconda).
    Leggi questi documenti:
    https://www.sqlservercentral.com/forums/topic/select-columns-from-different-tables-without-join
    http://www.drowningintechnicaldebt.com/ShawnWeisfeld/archive/2009/07/03/using-row-number-to-eliminate-the-multiplicative-effects-of-a.aspx
    Ottimo willy55, ho risolto col sistema delle 2 with + row_number e poi facendo una full join fra di loro.

    Grazie 1000!
  • Re: Consiglio su select

    E fare outher join ?

    SELECT GIACENZE.CODART,GIACENZE.LOTTO,ORDINI.NUMORD
    FROM GIACENZE
    ,ORDINI
    WHERE GIACENZE.CODART = '02622882-03282'
    AND ORDINI.CODART(+)=GIACENZE.CODART
    AND ORDINI.LOTTO(+)=GIACENZE.LOTTO
Devi accedere o registrarti per scrivere nel forum
7 risposte