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

    [MYSQL]Query annidate [help]

    Salve a tutti, il mio problema è che probabilmente non ho capito molto di come funzionano le query annidate, e in particolare mi riferisco a quelle query che effettuano un passaggio di binding, ma passo subito a illustrarmi il mio esempio:


    Tabella:

    Persona(nome, cognome, codfiscale)

    Il mio intento è quello di estrarre le persone che hanno degli omonimi (stesso nome e cognome ma diverso codice fiscale).
    Per motivi di (lo richiede l'esercizio) devo per forza usare le query annidate, a questo punto avevo pensato a una query di questo tipo:

    codice:
    SELECT P1.nome, P1.cognome, P1.codfiscale
    FROM persona P1
    WHERE P1.codfiscale  = any  ( SELECT P2.codfiscale
                                                FROM persona P2
                                                WHERE P1.nome = P2.nome AND
                                                P1.cognome = P2.cognome AND 
                                                P2.codfiscale <> P1.codfiscale)
    Inutile dirvi che questa query non tira fuori i risultati che mi aspettavo, anzi, non seleziona nessun valore.
    Dai testi successivi che ho fatto ho capito che l'errore è concettuale e dovuto al fatto che credo di non aver capito proprio come viene eseguita la query in questo caso.
    Io mi aspetterei che per ogni riga della query esterna venisse eseguita la subquery (la quale dovrebbe dare come risultato ogni volta i due codici fiscali delle due persone omonime (nel mio db ne ho messe solo due) e quindi dovrebbe essere fatto il controllo where per decidere se selezionare quella riga oppure no.
    Questo non accade, e non solo ma ho potuto constatare (lo dico quasi con certezza) che in realtà la subquery ogni volta che viene eseguita produce come risultato un solo valore e non due come mi aspettavo.

    Ad ogni modo quà serve uno che mi spieghi come effettivamente viene eseguita la query in questo caso.
    Da notare che, per "passaggio di binding" il libro intende il fatto che come potete constatare, nella subquery si fa riferimento alla tabella "persona P1" usata nella query esterna.

    Spero vivamente in un aiuto da un anima pia, io ci sto sbattendo da testa da stamattina ma non sono proprio riuscito a capirne il meccanismo.

  2. #2
    up

  3. #3
    visto che e' un esercizio fai che sia tale....

    esegui prima la subquery come fosse una query autonoma. Quando ottieni il risultato atteso allora agganci questa query come subquery della query iniziale (padre).

    sono di fatto due queries. Se quella annidata non rende quanto ti aspetti ovviamente il risultato sara' falsato.

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

  4. #4
    Ti ringrazio piero per l'attenzione e la risposta.
    In realtà il problema me lo sono risolto da solo poi (tanto c'ho sbattuto la testa) e ho scoperto che il MYSQL nei casi in cui nelle query annidate c'è un passaggio di binding raggiona in maniera completamente differente da quanto mi sarei aspettato, ed inoltre anche gli operatori di confronto che vengono usati (= any, <> all, exists ecc) hanno effetti particolari sulle query ritornanti insieme vuoto.

    Grazie comunque a tutti per l'attenzione.

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.