Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 26
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2011
    Messaggi
    106

    Differenza ra IN e EXISTS

    Ciao a tutti,ragazzi vorrei chiedere ,se qualcuno di voi sa spiegarmi quando usare IN rispetto ad EXIST e viceversa.Nel senso ,per me sembrano la stessa cosa.Quello che ho capito(almeno credo) é che ,IN confronta ad una ad una le singole righe,mentre con EXISTS si lavora su una tabella..
    Per aiutavi ad aiutarmi ,vi do un esempio:
    "Trovare nome e Reddito delle persone di cui si conosce la madre",che uso qui??Io li userei entrambi....
    Spero che possiate aiutarmi a capire..
    Grazie

  2. #2
    EXISTS (istruzione) verifica se esiste il nome indicato in modo da evitare un possibile errore di nome gia' esistente, mentre IN() (funzione) verifica il contenuto mettendo praticamente in OR tutte le possibili combinazioni elencate, cioe' ammesse e descritte nella funzione.

    campo IN(1,2,3)
    identico a:
    campo = 1 OR campo = 2 OR campo = 3

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

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2011
    Messaggi
    106
    In effetti,era una considerazione che avevo fatto...Solo che nn mi permette di rispondere a domande del tipo...
    Cosa cambia tra queste due interrogazioni,in SQL??
    Sono differenti,visto che la seconda mi stampa 3 persone in più..

    Prima Query:
    codice:
    SELECT Nome,Reddito                    
    FROM Persone
    WHERE  EXISTS (SELECT Figlio  FROM Paternita
                   UNION
                   SELECT Figlio FROM Maternita )
    Seconda Query:
    codice:
    SELECT Nome,Reddito                   
    FROM Persone
    WHERE Nome IN (
                   SELECT Figlio FROM Paternita
                   UNION
                   SELECT Figlio  FROM Maternita
                   )
    Sapresti darmi una risposta??
    Grazie.

  4. #4
    exists rende true o false. se true visualizza il primo trovato
    in() prende tutti i valori trovati e li mette in OR con il campo nome.

    il primo risponde alla domanda "ESISTONO?" risposta true/false e quindi non ha senso se vuoi la lista degli esistenti. In altre parole ancora... risponde ad una domanda di esistenza mentre IN() chiede invece se ci sono dei ben determinati valori.

    Inoltre UNION sovrascrive contenuti identici e quindi a nomi uguali avrai una sola risposta, tipo un distinct tanto per intenderci. Ma e' una struttura fondamentalmente errata la tua. Molte persone potrebbero dare lo stesso nome ad un figlio e tu nel caso ne otterresti solo uno in risposta e senza sapere quale sia il genitore.

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

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2011
    Messaggi
    106
    Originariamente inviato da piero.mac
    il primo risponde alla domanda "ESISTONO?" risposta true/false e quindi non ha senso se vuoi la lista degli esistenti.
    Proprio questo nn mi torna.Nel senso,risponde ad una domand di esistenta,ma mi genera qualcosa(in caso di true),che poi vado a confrontare.giusto?
    Inoltre UNION sovrascrive contenuti identici e quindi a nomi uguali avrai una sola risposta, tipo un distinct tanto per intenderci. Ma e' una struttura fondamentalmente errata la tua. Molte persone potrebbero dare lo stesso nome ad un figlio e tu nel caso ne otterresti solo uno in risposta e senza sapere quale sia il genitore.
    Sono esercizi presi da un libro e poi modificati,cmq ti ringrazio per la risposta completa,ma nn é quello che mi interessa capire ora...

  6. #6
    Originariamente inviato da Gianni91
    Proprio questo nn mi torna.Nel senso,risponde ad una domand di esistenta,ma mi genera qualcosa(in caso di true),che poi vado a confrontare.giusto?
    Direi di no. Potresti anche ricevere lo stesso risultato ma la cosa sarebbe del tutto casuale.

    exists - SE un record esiste risponde TRUE senza alcuna valutazione del contenuto. Quindi la select confrontera' il nome con TRUE. Tutti i nomi esistenti per il solo fatto di esistere nella tabella persone saranno TRUE anche i record vuoti ma non i record NULL. Exists renderebbe FALSE solo se, specificando un nome nel where cosa che non fai, questo figlio non esistesse nelle tabelle dei genitori oppure fosse con valore NULL.

    pippo = TRUE ??? si
    pollo = TRUE ??? si
    'empty' = TRUE ??? si
    NULL = TRUE ??? NO


    IN() - nell'elenco di IN() ci saranno per esempio IN('pippo', 'ciccio', 'puffo') e non solo un generico TRUE

    il confronto tra il nome della tabella persone sara':

    pippo = 'pippo' OR 'ciccio' OR 'puffo' ????? si
    pollo = 'pippo' OR 'ciccio' OR 'puffo' ????? NO
    'empty' = TRUE ??? NO
    NULL = TRUE ??? NO


    spero di essere stato esauriente.

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

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2011
    Messaggi
    106
    Quindi
    A-->Non sono assolutamente uguali.
    B-->Se mi serve un'informazione specifica,utilizzo IN,altrimenti se ho necessita si un INSIEME DI VALORI faccio ricorso ad EXISTS..

    giusto??

  8. #8
    EXISTS / NOT EXISTS sono da usare quando serve sapere se una certa cosa/oggetto esiste oppure no per evitare un possibile errore od una inutile query.

    1) create table IF NOT EXIST nome_tabella
    2) drop table IF EXIST nome_tabella
    3) select * from tab1 where exist (select * from tab2 WHERE nome = 'ciccio')

    1 - se esiste rende false e continua senza creare la tabella
    2 - se esiste rende true ed esegue il drop
    3 - se in tab2.nome esiste ciccio allora esegue la select su TUTTA la tab1 anche sui nomi diversi da ciccio. Se non esiste non esegue la query.
    EXISTS rende TRUE/FALSE al CREATE TABLE, al DROP, al where. Hai presente il famoso WHERE 1 ???


    La cosa corretta la otterresti con:

    select *
    from tab1
    inner join tab2 on tab1.nome = tab2.nome
    where tab2.nome = 'ciccio'

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

  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 2011
    Messaggi
    106
    Originariamente inviato da piero.mac

    3) select * from tab1 where exist (select * from tab2 WHERE nome = 'ciccio')

    3 - se in tab2.nome esiste ciccio allora esegue la select su TUTTA la tab1 anche sui nomi diversi da ciccio. Se non esiste non esegue la query.
    Questo mi fa capire,che nn c'è molta relazione tra la select esterna e la subquery,cioè il risultato che ottengo è indipendente dalla subquery,basta che ottengo true ed i valori sono della tabella esterna..

    La cosa corretta la otterresti con:

    select *
    from tab1
    inner join tab2 on tab1.nome = tab2.nome
    where tab2.nome = 'ciccio'
    Scusa a cosa ti riferisci ,con la cosa corretta?La stai confrontando con la query di sopra??
    Ma quindi é sbagliata ,quella di sopra??

    ps:Grazie,per la pazienza

  10. #10

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 © 2026 vBulletin Solutions, Inc. All rights reserved.