Pagina 1 di 7 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 64
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442

    [SQL] Interrogazioni nidificate

    Ciao, supponendo questa query:

    SELECT NOME, COGNOME
    FROM IMPIEGATI AS I
    WHERE NOT EXISTS (SELECT * FROM IMPIEGATI AS I2 WHERE (I.NOME=I2.NOME) AND (I.COGNOME=I2.COGNOME) AND (I.CODICE<>I2.CODICE)))

    E' possibile scrivere la stessa query (trova nome e cognome degli impiegati che non hanno omonimi) senza usare interrogazioni nidificate?
    Io avevo pensato di sì scrivendola in questo modo:
    SELECT DISTINCT I.NOME, I.COGNOME
    FROM IMPIEGATI AS I, IMPIEGATI AS I2
    WHERE (I.NOME <> I2.NOME) AND (I.COGNOME<>I2.COGNOME);

    Però non funziona, in quanto restituisce anche gli impiegati con omonimi, e non capisco perché.
    Mi aiutereste? Grazie!

  2. #2
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Perché hai fatto una cross join.
    codice:
    s*lect nome, cognome from impiegati group by nome, cognome having count(*) = 1
    Così dovrebbe funzionare. Scusa per l'asterisco al posto della e ma altrimenti il forum non mi lascia postare

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    La tua versione funziona però continuo a non capire perché la mia non va. Hai detto "perché hai fatto una cross join". Ti riferisci al prodotto cartesiano fra tabelle? E se sì, non capisco come questo spieghi il non funzionamento. Grazie!

  4. #4
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Sì, mi riferisco a quello. La tua idea è proprio sbagliata concettualmente.
    Tu dovevi trovare quelli che non hanno omonimi, ma la tua query non fa altro che trovare tutti i nomi che hanno in tabella almeno un altro nome diverso. E' ovvio che escano tutti: se uno ha un omonimo, verrà scartata la riga in cui si accoppia col suo omonimo, ma rimangono comunque gli accoppiamenti con tutti gli altri nomi che, essendo diversi dal suo, passeranno il test della tua where. Quindi alla fine hai tutti i nomi per forza.
    Non so se così sia più chiaro....

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Potrei dedurre da questo la "regola" che se ho bisogno di fare confronti positivi il crosso join va ancora bene mentre per quelli negativi (cioè, non corrispondenza) è impossibile da usare?
    Io sono proprio una frana ad impostare le query, specialmente quelle complicate

  6. #6
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Il cross join non va bene mai, perché non esistono logiche che lo giustifichino. Questo a parte eccezioni di cui non saprei farti esempi.
    Se devi fare confronti "positivi", come li hai chiamati, devi mettere delle clausole di where che renderebbero la query un inner join, anche se non esplicito.

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    In questo topic http://forum.html.it/forum/showthrea...readid=2939594 forse trovi un esempio in cui ha senso usare il cross join (almeno, credo!).

    Sempre parlando di query nidificate, avrei bisogno di un altro aiuto.
    Dato il seguente schema:

    FILM(Titolo, Anno, Regista)
    REGISTA(Nome, AnnoNascita)
    ATTORE(Nome, AnnoNascita)
    RECITAZIONE(TitoloFilm, NomeAttore)

    Selezionare i nomi dei registi che hanno recitato solo in film diretti da loro stessi.

    La soluzione proposta (una delle possibili) è con 3 query annidate:

    codice:
    SELECT NOME    
    FROM REGISTA R1    
    WHERE  (NOT EXIST (SELECT * 
    FROM FILM F
    WHERE ((F.TITOLO=ANY
    SELECT R.TITOLOFILM
    FROM RECITAZIONE R
    WHERE (R.NOMEATTORE=R1.NOME)) AND (R1.NAME<>F.REGISTA))))
    Sinceramente non la capisco proprio...
    Inoltre, si poteva fare diversamente?
    Ancora grazie.

  8. #8
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Quante domande
    No, il thread che hai linkato è proprio l'esempio che avevo fatto io di inner join implicita.
    codice:
    SELECT NOME, COGNOME
    FROM GENITORI AS G1, GENITORI AS G2
    WHERE (G1.NOMEGEN=G2.NOME) AND (G1.COGNOMEGEN=G2.COGNOME)
    potrebbe essere riscritta così
    codice:
    SELECT NOME, COGNOME
    FROM GENITORI AS G1 join GENITORI AS G2 on (G1.NOMEGEN=G2.NOME AND G1.COGNOMEGEN=G2.COGNOME)
    (fermo restando che nome e cognome nella select hanno bisogno del qualificatore davanti, altrimenti avresti un'ambiguità)

  9. #9
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Riguardo la storia degli attori, quella dopo la where è una subquery correlata, spero che il concetto ti dica qualcosa.
    Fra l'altro, riguardandola bene, non sono affatto convinto che funzioni. Che significa "soluzione proposta"?
    Ultima modifica di luca200; 06-06-2016 a 18:28

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    442
    Quote Originariamente inviata da luca200 Visualizza il messaggio
    Riguardo la storia degli attori, quella dopo la where è una subquery correlata, spero che il concetto ti dica qualcosa.
    Fra l'altro, riguardandola bene, non sono affatto convinto che funzioni. Che significa "soluzione proposta"?
    Subquery correlata no, non mi dice niente. Finora nelle slide non sono state nominate.
    Soluzione proposta nel senso che viene presentata come una possibile soluzione al quesito. Non l'ho provata francamente, cercavo prima di capirla.
    Grazie per la pazienza!

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.