Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [MySql] query union e condizione where

    Buongiorno,

    sto cercando di adattare una full union a mysql, ma non riesco a far funzionare la condizione

    codice:
    SELECT clienti.id,clienti.cliente,sap_pdv_clienti.*
    
    FROM clienti
    
    LEFT JOIN sap_pdv_clienti
    ON clienti.id = sap_pdv_clienti.id_cliente
    
    UNION
    
    SELECT clienti.id,clienti.cliente,sap_pdv_clienti.*
    
    FROM sap_pdv_clienti
    
    LEFT JOIN clienti
    ON clienti.id = sap_pdv_clienti.id_cliente
                                   
    WHERE sap_pdv_clienti.id_pdv=159
    fondamentalmente mi sreve che tiri fuori tutto, ma solo se il campo id_pdv della tabella sap_pdv_clienti è uguale al valore nella clausola where, in questo caso 159, ma così facendo tira fuori tutto anche se con id_pdv=159 non c'è assolutamente nulla.

    Sapreste darmi una mano?

    Grazie
    SK

  2. #2
    specifica la where anche nella prima select

  3. #3
    Originariamente inviato da optime
    specifica la where anche nella prima select
    Ho provato, mi son dimenticato di scriverlo, ma mi tira fuori solo i valori realmente pieni, mi spiego.

    facciamo conto di avere una tabella clienti con campo id e campo cliente che contiene il nome del cliente, e nella tabella sap id_cliente,id_pdv e codice sap, io ho la necessità di dover tirare fuori tutti i clienti a prescindere e la dove nella tabella sap_pdv_clienti c'è un valore come codice_sap, visualizzarlo, se non esiste, lasciare il campo vuoto, ma la lista dei clienti mi serve completa con tutti i clienti.

  4. #4
    Originariamente inviato da serialkiller
    Ho provato, mi son dimenticato di scriverlo, ma mi tira fuori solo i valori realmente pieni, mi spiego.

    facciamo conto di avere una tabella clienti con campo id e campo cliente che contiene il nome del cliente, e nella tabella sap id_cliente,id_pdv e codice sap, io ho la necessità di dover tirare fuori tutti i clienti a prescindere e la dove nella tabella sap_pdv_clienti c'è un valore come codice_sap, visualizzarlo, se non esiste, lasciare il campo vuoto, ma la lista dei clienti mi serve completa con tutti i clienti.
    Ovvio che se metti come left prima una e poi l'altra tabella in union avrai tutti i record.

    Metti la seconda query della UNION come INNER JOIN.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  5. #5
    Originariamente inviato da piero.mac
    Ovvio che se metti come left prima una e poi l'altra tabella in union avrai tutti i record.

    Metti la seconda query della UNION come INNER JOIN.
    Ciao Piero,

    io ho fatto così:
    codice:
    SELECT clienti.id,clienti.cliente,sap_pdv_clienti.*
    
    FROM clienti
    
    LEFT JOIN sap_pdv_clienti
    ON clienti.id = sap_pdv_clienti.id_cliente
    
    UNION
    
    SELECT clienti.id,clienti.cliente,sap_pdv_clienti.*
    
    FROM sap_pdv_clienti
    
    INNER JOIN clienti
    ON clienti.id = sap_pdv_clienti.id_cliente
                                   
    WHERE sap_pdv_clienti.id_pdv=159
    id_pdv 159 non esiste nella tabella sap_pdv_clienti, ma mi aspetterei che mi tirasse fuori comunque tutti e 49 i clienti di prova che ho inserito con il valore di codice_sap nullo, se invece uso un id_pdv che contiene tutti o in parte i codici_sap di ogni cliente, dovrebero uscire sempre tutti i clienti e abbinato il loro codice_sap la dove esiste, altrimenti il campo null, cosa sbaglio ancora?

  6. #6
    la union, cosi' come la presenti, con la prima query deve tirar fuori tutti i clienti e solo i record di
    sap_pdv_clienti dove corrisponde l'id. Gli altri record dove non corrisponde l'id dara' NULL

    Ora non ho chiaramente capito cosa vuoi fare con la seconda query della UNION. La condizione where seleziona solo i record che hanno id_pvd = 159

    Se vuoi tutti i clienti e solo le condizioni di equi-join tra clienti.id = sap_pdv_clienti.id_cliente, allora basta la prima query.

    Forse l'errore e' quello di cercare l'id_cliente che mi pare di capire sia diverso da id_pvd. Cerca l'equi-join tra cliente.id_pvd (se esiste) e sap_pdv_clienti.id_pdv. QUindi avrebbe senso usare left join nella seconda query.

    codice:
    ......
    
    UNION
    
    SELECT clienti.id,clienti.cliente,sap_pdv_clienti.*
    FROM sap_pdv_clienti
    
    LEFT JOIN clienti ON clienti.id_pdv = sap_pdv_clienti.id_pdv
                                   
    WHERE sap_pdv_clienti.id_pdv=159
    ma renderebbe solo i record dove id_pdv = 159. Se li vuoi tutti non usare il WHERE.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  7. #7
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    Se ho capito bene tu vuoi
    TUTTI i clienti

    Di questi TUTTI:
    __ Quelli che non hanno nulla nella tabella " sap_pdv_clienti " devono avere i campi vuoti
    __ Quelli che hanno qualcosa nella tabella " sap_pdv_clienti " ma che NON sia 159 devono avere i campi vuoti
    __ Quelli che hanno qualcosa nella tabella " sap_pdv_clienti " che sia 159 devono avere i campi pieni

    è giusto ?????

    __________________________________________________ ____


    In questo caso farei un LEFT JOIN fra

    La tabella clienti
    e
    una SELECT su "sap_pdv_clienti" WHERE TuoCampo=159

    __________________________________________________ ____



    In Access viene qualcosa cosi
    in MySql ( che non uso ) dovrebbe essere molto simile

    codice:
    SELECT 
    
    clienti.id, 
    clienti.cliente, 
    q1.id_cliente, 
    q1.id_pdv
    
    FROM 
    
    clienti 
    
    LEFT JOIN 
    
    (
    SELECT 
    sap_pdv_clienti.id_cliente, 
    sap_pdv_clienti.id_pdv
    
    FROM 
    
    sap_pdv_clienti
    
    WHERE (((sap_pdv_clienti.id_pdv)=159))
    ) AS q1 
    
    ON clienti.id = q1.id_cliente



    Saluti

  8. #8
    Originariamente inviato da piero.mac
    la union, cosi' come la presenti, con la prima query deve tirar fuori tutti i clienti e solo i record di
    sap_pdv_clienti dove corrisponde l'id. Gli altri record dove non corrisponde l'id dara' NULL

    Ora non ho chiaramente capito cosa vuoi fare con la seconda query della UNION. La condizione where seleziona solo i record che hanno id_pvd = 159

    Se vuoi tutti i clienti e solo le condizioni di equi-join tra clienti.id = sap_pdv_clienti.id_cliente, allora basta la prima query.

    Forse l'errore e' quello di cercare l'id_cliente che mi pare di capire sia diverso da id_pvd. Cerca l'equi-join tra cliente.id_pvd (se esiste) e sap_pdv_clienti.id_pdv. QUindi avrebbe senso usare left join nella seconda query.

    codice:
    ......
    
    UNION
    
    SELECT clienti.id,clienti.cliente,sap_pdv_clienti.*
    FROM sap_pdv_clienti
    
    LEFT JOIN clienti ON clienti.id_pdv = sap_pdv_clienti.id_pdv
                                   
    WHERE sap_pdv_clienti.id_pdv=159
    ma renderebbe solo i record dove id_pdv = 159. Se li vuoi tutti non usare il WHERE.
    La query che ho postato prima con la seconda in INNER (idem con LEFT) tira fuori tutti i clienti, ma senza prendere in considerazione la clausola WHERE, quindi se passo un id_pdv non ancora presente nella tabella sap_pdv_clienti, mi tira fuori gli stessi risultati, invece mi aspetterei una list clienti con codice_sap NULL su tutti.

    Ho come l'impressione che non si possa fare in questo modo, io ho due tabelle, una clienti e una sap_pdv_clienti, in quest'ultima ho i campi: id,id_cleinte,id_pdv e codice_sap, la relazione tra le due è ovviamente l'id della tabella clienti e id_cliente nella tabella sap_pdv_clienti, quello che a me serve è: passato un determinato id_pdv, la query dovrebbe tirarmi fuori tutti i clienti a prescindere se presenti col loro id nella tabella sap_pdv_clienti e abbinarci, se presente nella tabella sap_pdv_clienti, il loro codice_sap, altrimenti restituire NULL.
    Il campo clienti.id_pdv non esiste nella tabella clienti perchè non esiste nessuna relazione

    Quindi se nella tabella clienti avessi una cosa del tipo:

    ID | cliente

    1 pippo
    2 pluto
    3 paperino

    e nella tabella sap_pdv_clienti:

    ID | id_pdv | id_cliente | codice_sap

    1 10 1 0001
    2 10 2 0002
    3 25 1 0003

    passando alla query l'id_pdv 10 vorrei ottenere una cosa del tipo:

    pippo 0001
    pluto 0002
    paperino NULL

    di conseguenza se passassi come id_pdv 50 che nella tabella sap_pdv_clienti non è presente, dovrebbe comunque darmi:

    pippo NULL
    pluto NULL
    paperino NULL

  9. #9
    Originariamente inviato da nman
    Se ho capito bene tu vuoi
    TUTTI i clienti

    Di questi TUTTI:
    __ Quelli che non hanno nulla nella tabella " sap_pdv_clienti " devono avere i campi vuoti
    __ Quelli che hanno qualcosa nella tabella " sap_pdv_clienti " ma che NON sia 159 devono avere i campi vuoti
    __ Quelli che hanno qualcosa nella tabella " sap_pdv_clienti " che sia 159 devono avere i campi pieni

    è giusto ?????
    Si è giusto, il valore 159 è indicativo, nel senso che vale per tutti gli id_pdv non presenti nella tabella sap_pdv_clienti, man mano ci saranno tutti, ma inizialmente no, quindi, semplicemente, TUTTI i clienti e i campi codice_sap pieni, solo qualor nella tabella ci sia un valore, altrimenti vuoti, adesso provo la query e provo, l'sql non dovrebbe cambiare di una virgola

  10. #10
    Perfetto, funziona correttamente.

    Grazie a tutti

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.