Alternativa a query UNION

di il
17 risposte

Alternativa a query UNION

Ciao a tutti, sono nuovo del forum, sto cercando di risolvere una questione:

ho due tabelle:
TArticoli (con i seguenti campi)
IDArticolo
CodArticolo
Desc

TArticoliCodBarre (con i seguenti campi)
IDArticolo
CodBarre

sto cercando di costruire una query che mi estragga tutti i record della tabella TArticoli duplicando però quelli presenti nella tabella TArticoliCodBarre

Esempio:

se nella tabella TArticoli è presente un articolo con CodArticolo 001 e Desc Articolo di prova e lo stesso articolo è presente (usando come chiave l'IDArticolo) nella tabella TArticoliCodBarre con CodBarre 123456, la query mi deve restituire:


001 Articolo di prova
123456 Articolo di prova


avete qualche idea?

Grazie a tutti

17 Risposte

  • Re: Alternativa a query UNION

    Un po' confuso ma parrebbe un left join (se vuoi tutte righe prima tabella) o inner (solo righe in entrambe le tabelle)
  • Re: Alternativa a query UNION

    +m2+ ha scritto:


    Un po' confuso ma parrebbe un left join (se vuoi tutte righe prima tabella) o inner (solo righe in entrambe le tabelle)
    Con left non mi elenca due volte il record, ma mi crea una cosa del genere:

    001 Articolo di prova 123456

    e con l'inner non fa minimamente quello che mi serve....
  • Re: Alternativa a query UNION

    Mi sembra di capire che vuoi ottenere il prodotto cartesiano....
    Vuoi che il set dei risultati sia composto dal numero di righe della prima tabella moltiplicato per il numero di righe della seconda? Se Si, ti serve una Cross Join.

    Non sono pratico di Access ma su SQL Server farei:
    SELECT [quello che vuoi]
    FROM TArticoli a
    CROSS JOIN TArticoliCodBarre b
    ORDER BY a.IDArticolo;
  • Re: Alternativa a query UNION

    A ma parrebbe più una UNION ma dove la seconda parte ha un join con la prima.
    Con access non ne ho la minima idea
  • Re: Alternativa a query UNION

    Toki ha scritto:


    Mi sembra di capire che vuoi ottenere il prodotto cartesiano....
    Vuoi che il set dei risultati sia composto dal numero di righe della prima tabella moltiplicato per il numero di righe della seconda? Se Si, ti serve una Cross Join.

    Non sono pratico di Access ma su SQL Server farei:
    SELECT [quello che vuoi]
    FROM TArticoli a
    CROSS JOIN TArticoliCodBarre b
    ORDER BY a.IDArticolo;
    non è così purtroppo. quello che ho bisogno è che un articolo presente in anagrafica, se ha il corrispondente codice a barre venga elencato due volte nella query
  • Re: Alternativa a query UNION

    +m2+ ha scritto:


    A ma parrebbe più una UNION ma dove la seconda parte ha un join con la prima.
    Con access non ne ho la minima idea
    e con SQL?
  • Re: Alternativa a query UNION

    SELECT campo1, campo2, campo3 FROM tabella1
    UNION
    SELECT campo1, campo2, campo3 FROM Tabella 2
    
    OVVIAMENTE i campi devono essere dello stesso tipo edi campi devono corrispondere allo stesso campo.

    Se in una tabella non esiste il campo allora devi sostituirlo con:

    NULL As NomeCampo
  • Re: Alternativa a query UNION

    gibra ha scritto:


    SELECT campo1, campo2, campo3 FROM tabella1
    UNION
    SELECT campo1, campo2, campo3 FROM Tabella 2
    
    OVVIAMENTE i campi devono essere dello stesso tipo edi campi devono corrispondere allo stesso campo.

    Se in una tabella non esiste il campo allora devi sostituirlo con:

    NULL As NomeCampo
    Grazie , ci siamo quasi, non sapevo si potesse bypassare il fatto che i campi non fossero presenti in entrambe le tabelle.
    Mi manca una cosa, mi scrive due volte (correttamente) il codice ma non mi riporta la descrizione quando elenca il record della tabella TarticoliCodBarre

    in pratica mi scrive

    001 Articolo di prova
    123456

    mentre io avrei bisogno di
    001 Articolo di prova
    123456 Articolo di prova


    qualche altro suggerimento?

    Grazie ancora
  • Re: Alternativa a query UNION

    Per ottenere la descrizione nella query che non ce l'ha devi mettere in INNER JOIN le due tabelle.
  • Re: Alternativa a query UNION

    gibra ha scritto:


    Per ottenere la descrizione nella query che non ce l'ha devi mettere in INNER JOIN le due tabelle.
    ok grazie, ma non riesco a combinare la INNER con la UNION...

    SELECT TArticoli.IDArticolo, TArticoli.CodArticolo, TArticoli.Desc
    FROM TArticoli
    UNION
    SELECT TArticoliCodBarre.IDArticolo, TArticoliCodBarre.CodBarre as CodArticolo,NULL
    FROM TArticoliCodBarre

    questo funziona e mi restituisce:
    IDArticolo CodArticolo Desc
    5 001 articolo di prova
    5 0714983449106

    vorrei che anche sul secondo record mi venisse scritta le descrizione

    grazie
  • Re: Alternativa a query UNION

    Ovvio che non riesci, non lo fai proprio il JOIN.
    Scusa, non sai fare un JOIN?

    https://www.w3schools.com/sql/sql_join_inner.as
  • Re: Alternativa a query UNION

    gibra ha scritto:


    Ovvio che non riesci, non lo fai proprio il JOIN.
    Scusa, non sai fare un JOIN?

    https://www.w3schools.com/sql/sql_join_inner.as
    in realtà non è un join (a colonne), bensì una UNION con selezione (a righe).
    Non so quale sia il motivo pratico, con mysql ci sono le subquery, con access.. boh...
  • Re: Alternativa a query UNION

    +m2+ ha scritto:


    in realtà non è un join (a colonne), bensì una UNION con selezione (a righe).
    Non so quale sia il motivo pratico, con mysql ci sono le subquery, con access.. boh...
    No, mi meraviglio della tua affermazione!
    Se vuole un campo che è nell'altra tabella deve mettere in join le due tabelle.
  • Re: Alternativa a query UNION

    gibra ha scritto:


    +m2+ ha scritto:


    in realtà non è un join (a colonne), bensì una UNION con selezione (a righe).
    Non so quale sia il motivo pratico, con mysql ci sono le subquery, con access.. boh...
    No, mi meraviglio della tua affermazione!
    Se vuole un campo che è nell'altra tabella deve mettere in join le due tabelle.
    Io invece non mi meraviglio di niente, ormai

    Da quanto, con un po' di fantasia, si può dedurre, non vuole un JOIN inteso, come sopra scritto, di
    RIGA cui i CAMPI vengono giustapposti (che è una selezione-proiezione di un prodotto cartesiano), bensì
    PIU' RIGHE le quali contengono i singoli record che sono in JOIN con la tabella master.

    In sostanza intendo il risultato (o meglio "invento") così ...
    riga-tabella-master-chiave-X
    riga-tabella-slave-in-join-con-chiave-X
    riga-tabella-slave-in-join-con-chiave-X
    riga-tabella-master-chiave-Y
    riga-tabella-slave-in-join-con-chiave-Y
    riga-tabella-slave-in-join-con-chiave-Y
    (...)
    riga-tabella-slave-in-join-con-chiave-Y

    Sempre con un po' di fantasia è una UNION di tabella master con (join tabella slave).
    Che poi questo sia comodo è un altro discorso, comunque con mysql (e un po' di pratica SQL) è fattibile.
    Riguardo alla "uniformizzazione" dei campi (colonne), come già scritto, usualmente si lavora di AS e CAST (sempre in sistemi non access).
Devi accedere o registrarti per scrivere nel forum
17 risposte