Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2007
    Messaggi
    34

    SQL query innestate con doppia negazione

    Salve,
    ho travato in rete questo esempio di query innestata con le seguenti tabelle:

    RIUNIONE(CodR, Descrizione, DataRiunione)
    DIPENDENTE(CodD, Nome, Cognome, DataNascita, Citta)
    PARTECIPA RIUNIONE(CodD, CodR)

    Testo interrogazione

    Visualizzare il codice dei dipendenti che hanno partecipato sola-
    mente alle riunioni alle quali ha partecipato il dipendente D100
    (CodD='D100').


    Soluzione

    codice:
    SELECT CodD FROM DIPENDENTE AS D WHERE CodD NOT IN (SELECT CodD FROM PARTECIPA_RIUNIONE WHERE CodR NOT IN (SELECT CodR FROM PARTECIPA_RIUNIONE WHERE CodD='D100'));
    Non ho capito il ragionamento della doppia negazione.

    Inoltre sempre sulle stesse tabelle, non ho capito la differenza concettuale di quest'altra interrogazione dalla precedente:

    Testo interrogazione
    Visualizzare il codice dei dipendenti che hanno partecipato a tutte e
    sole le riunioni alle quali ha partecipato il dipendente D100 (CodD='D100').

    Soluzione

    codice:
    SELECT CodD FROM PARTECIPA_RIUNIONE AND CodR IN (SELECT CodR FROM PARTECIPA_RIUNIONE WHERE CodD='D100') AND CodD NOT IN (SELECT CodD FROM PARTECIPA_RIUNIONE WHERE CodR NOT IN (SELECT CodR FROM PARTECIPA_RIUNIONE WHERE CodD='D100')) GROUP BY CodD HAVING COUNT(*)=(SELECT COUNT(*) FROM PARTECIPA_RIUNIONE WHERE CodD='D100')
    C'è qualcuno che può darmi delle delucidazioni?

  2. #2

    Re: SQL query innestate con doppia negazione

    Originariamente inviato da Pata74
    Salve,
    ho travato in rete questo esempio di query innestata con le seguenti tabelle:

    RIUNIONE(CodR, Descrizione, DataRiunione)
    DIPENDENTE(CodD, Nome, Cognome, DataNascita, Citta)
    PARTECIPA RIUNIONE(CodD, CodR)

    Testo interrogazione

    Visualizzare il codice dei dipendenti che hanno partecipato sola-
    mente alle riunioni alle quali ha partecipato il dipendente D100
    (CodD='D100').

    Soluzione

    codice:
    SELECT CodD FROM DIPENDENTE AS D WHERE CodD NOT IN (SELECT CodD FROM PARTECIPA_RIUNIONE WHERE CodR NOT IN (SELECT CodR FROM PARTECIPA_RIUNIONE WHERE CodD='D100'));
    Non ho capito il ragionamento della doppia negazione.
    Io avrei risolto così, perchè tutte quelle IN e NOT IN su un vero database (quindi caso reale) i tempi di risposta sono molto lunghi:

    SELECT DISTINCT B.CODD FROM PARTECIPA_RIUNIONE A, PARTECIPA_RIUNIONE B
    WHERE CODD='D100'
    AND A.CODR=B.CODR

    Inoltre sempre sulle stesse tabelle, non ho capito la differenza concettuale di quest'altra interrogazione dalla precedente:

    Testo interrogazione
    Visualizzare il codice dei dipendenti che hanno partecipato a tutte e
    sole le riunioni alle quali ha partecipato il dipendente D100 (CodD='D100').

    Soluzione

    codice:
    SELECT CodD FROM PARTECIPA_RIUNIONE AND CodR IN (SELECT CodR FROM PARTECIPA_RIUNIONE WHERE CodD='D100') AND CodD NOT IN (SELECT CodD FROM PARTECIPA_RIUNIONE WHERE CodR NOT IN (SELECT CodR FROM PARTECIPA_RIUNIONE WHERE CodD='D100')) GROUP BY CodD HAVING COUNT(*)=(SELECT COUNT(*) FROM PARTECIPA_RIUNIONE WHERE CodD='D100')
    C'è qualcuno che può darmi delle delucidazioni?
    Anche in questo caso la soluzione ottimale è la seguente query:

    Select B.* from
    (Select * from PARTECIPA_RIUNIONE Where CODD='D100') A, --> ESTRAE TUTTI LE PARTECIPA_RIUNIONE DI DIPENDENTE 1
    (Select * from PARTECIPA_RIUNIONE Where CODD<>'D100') B, --> ESTRAE TUTTI LE PARTECIPA_RIUNIONE DI DIPENDENTI NON 1
    (Select COUNT(*) COUNT_R from PARTECIPA_RIUNIONE Where CODD='D100') C, --> ESTRAE IL COUNT DELLE PARTECIPA_RIUNIONE DI 1
    (Select CODD, COUNT(*) COUNT_R from PARTECIPA_RIUNIONE Where CODD<>'D100' Group by CODD) D --> ESTRAE IL COUNT DELLE PARTECIPA_RIUNIONE DI NON 1
    Where A.CODR=B.CODR
    AND C.COUNT_R=D.COUNT_R
    AND D.CODD=B.CODD

    dove vengono estratti solo i dipendenti che hanno partecipate alle stesse riunioni di D100, ossia
    - se D100 ha partecipato a A, B, C
    - se D101 ha partecipato a A, C
    - se D102 ha partecipato a B, C
    - se D103 ha partecipato a B, C, A
    - se D104 ha partecipato a A, B, C, D

    in questo caso il risultato è: D103!

    Ciao
    Mik

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2007
    Messaggi
    34
    Grazie mille! Davvero esaudiente

  4. #4

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2007
    Messaggi
    34
    Attenzione, ho provato concretamente le query però la prima non credo sia corretta inquanto restituisce D100 e non gli altri dipendenti...

    codice:
    SELECT DISTINCT B.CODD FROM PARTECIPA_RIUNIONE AS A, PARTECIPA_RIUNIONE AS B WHERE B.CODD = 'D100' AND A.CODR = B.CODR

  6. #6
    Utente di HTML.it
    Registrato dal
    Mar 2007
    Messaggi
    34
    codice:
    Select DISTINCT B.CodD from (Select * from PARTECIPA_RIUNIONE Where CODD='D100') AS A, (Select * from PARTECIPA_RIUNIONE Where CODD<>'D100') AS B Where A.CODR=B.CODR
    Ecco così e' giusta ...

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.