QUERY ricerca valori non in tabella

di
Anonimizzato12961
il
7 risposte

QUERY ricerca valori non in tabella

Spettabile Forum di iprogrammatori.it mi trovo davanti a un problema cui non riesco ad uscirne
ho la tabella clienti e la tabella ordinativi vorrei conoscere quali clienti non hanno ordinativi da evadere.
Se il cliente non ha mai effettuato ordinativi il problema viene risolto con left join ma se il cliente ha ordinativi evasi non riesco ad estrapolare il dato del solo nominativo del cliente che ha effettuato ordini in passato ma non ha ordini da evadere
grazie

es tabella clienti con campi:
idcliente - nome
1 - a
2 - b
3 - c
tabella ordini con campi:
idcliente - dataordine - evaso
1 01/01/2013 - no
2 01/01/2012 - si
3 01/01/2011 - si
3 01/01/2013 - no

ordine cliente a da evadere
ordine cliente b già evaso
ordine cliente c evaso
ordine cliente c da evadere
la query dovrebbe dare come risultato solo il cliente b (perché il cliente a e il cliente c hanno già un ordine da evadere)
grazie

7 Risposte

  • Re: QUERY ricerca valori non in tabella

    Non c'entra il JOIN che usi, ma la condizione che imposti, che potrebbe essere:
    SELECT <elenco_campi>
    FROM Clienti INNER JOIN Ordini
    WHERE Ordini.Evaso = 'si'
  • Re: QUERY ricerca valori non in tabella

    Ciao,

    La query proposta da gibra non va bene o meglio va ampliata altrimenti otterresti sia il cliente 2 sia il 3 ma il 3 non lo vuoi perche' ha ancora un ordine da evadere.

    La query da scrivere e' grosso modo cosi :
    
    SELECT o.idCliente
    FROM Ordini o
    WHERE o.evaso = 'si' and o.idCliente NOT IN (
                                                                     SELECT o1.idCliente
                                                                     FROM Ordini o1
                                                                     WHERE o1.evaso = 'no')          
    
    In pratica che fa la query.

    ti restituisce l'id del cliente che ha ordini evasi il quale cliente pero non ha ordini ancora da evadere.

    La sottoquery restituisce l'id dei clienti che hanno ordini ancora da evadere,
    nella query principale tu prendi clienti con ordine evaso e che non siano nella sottoquery ossia non abbiano ordini ancora da evadere.

    PS
    Io ho fatto tutto usando solo la tabella ordini perche' ho restituito solo idCliente se volessi ad esempio anche il nome del cliente devi mettere in join le tabelle.

  • Re: QUERY ricerca valori non in tabella

    Gentilissimo Bomberdini, ho provato il tuo suggerimento, che credo teoricamente corretto, ma uso un db access 2007 e il file ordine contiene circa 60.000 record, pertanto il computer si impalla con l'istruzione "not in", pensi ci possa essere qualche alternativa, del tipo estratta i clienti che non hanno fatto ordini un certo lasso di tempo ?
    grazie
  • Re: QUERY ricerca valori non in tabella

    Bomberdini ha scritto:


    Ciao,

    La query proposta da gibra non va bene o meglio va ampliata altrimenti otterresti sia il cliente 2 sia il 3 ma il 3 non lo vuoi perche' ha ancora un ordine da evadere.
    Mi aspettavo questa osservazione.

    Il problema è un'altro, infatti la domanda era:
    vorrei conoscere quali clienti non hanno ordinativi da evadere
    Per cui perchè escludere il 3, dato che HA un ordina da evadere?
    Magari non ci arrivo io ...
  • Re: QUERY ricerca valori non in tabella

    Mikiorso ha scritto:


    ma uso un db access 2007
    Allora perchè hai postato sulla sezione sbagliata: SQL Server ?
  • Re: QUERY ricerca valori non in tabella

    gibra ha scritto:


    Bomberdini ha scritto:


    Ciao,

    La query proposta da gibra non va bene o meglio va ampliata altrimenti otterresti sia il cliente 2 sia il 3 ma il 3 non lo vuoi perche' ha ancora un ordine da evadere.
    Mi aspettavo questa osservazione.

    Il problema è un'altro, infatti la domanda era:
    vorrei conoscere quali clienti non hanno ordinativi da evadere
    Per cui perchè escludere il 3, dato che HA un ordina da evadere?
    Magari non ci arrivo io ...
    Si la domanda puo' essere stata scritta non al meglio ma se la leggi bene si capisce.

    Quello che dici tu che scritto ma,
    ce scritto anche
    Se il cliente non ha mai effettuato ordinativi il problema viene risolto con left join ma se il cliente ha ordinativi evasi non riesco ad estrapolare il dato del solo nominativo del cliente che ha effettuato ordini in passato ma non ha ordini da evadere
    che fa un po di chiarezza e fa capire che la query proposta da te non va bene
  • Re: QUERY ricerca valori non in tabella

    Mikiorso ha scritto:


    gentilissimo Bomberdini, ho provato il tuo suggerimento, che credo teoricamente corretto, ma uso un db access 2007 e il file ordine contiene circa 60.000 record, pertanto il computer si impalla con l'istruzione "not in", pensi ci possa essere qualche alternativa, del tipo estratta i clienti che non hanno fatto ordini un certo lasso di tempo ?
    grazie

    Sicuramente puoi estrarre dati solo in un lasso di tempo aggiungendo alcune specifiche nel WHERE

    Comunque se la query e' molto lenta potresti pensare di inserire degli indici sui campi maggiormente usati nel where

Devi accedere o registrarti per scrivere nel forum
7 risposte