FORUM DEL CORSO DI BASI DI DATI

Vuoi reagire a questo messaggio? Crea un account in pochi click o accedi per continuare.
FORUM DEL CORSO DI BASI DI DATI

Forum del corso di Basi di Dati - Ingegneria Gestionale - Università di Roma La Sapienza


2 partecipanti

    [7 ESERCITAZIONE] - Esercizio d'esame su SQL

    avatar
    A.Marrella
    Admin


    Maschio
    Numero di messaggi : 72
    Età : 41
    Occupazione/Hobby : Tutor
    Data d'iscrizione : 26.02.09

    [7 ESERCITAZIONE] - Esercizio d'esame su SQL Empty [7 ESERCITAZIONE] - Esercizio d'esame su SQL

    Messaggio Da A.Marrella Ven Apr 24, 2009 6:22 pm

    Ragazzi, discutete qui riguardo eventuali soluzioni alternative che avete calcolato per l'esercizio d'esame proposto a lezione.
    Nel frattempo, ho inserito sulla pagina web le slides ed il file SQL con un'istanza di Base di Dati per permettervi di fare i vostri test anche su MySQL
    Buon lavoro study
    avatar
    A.Marrella
    Admin


    Maschio
    Numero di messaggi : 72
    Età : 41
    Occupazione/Hobby : Tutor
    Data d'iscrizione : 26.02.09

    [7 ESERCITAZIONE] - Esercizio d'esame su SQL Empty Re: [7 ESERCITAZIONE] - Esercizio d'esame su SQL

    Messaggio Da A.Marrella Ven Apr 24, 2009 6:44 pm

    Prima di tutto, vorrei analizzare due soluzioni alternative (le più gettonate) fornitemi a lezione da alcuni studenti riguardo la domanda 6 dell'esercizio d'esame, ovvero:

    6) Estrarre i nomi degli stadi in cui non gioca nessuna nazionale Europea

    La prima soluzione che analizziamo è la seguente :

    SELECT distinct NomeStadio
    FROM Incontro
    WHERE Squadra1 not in
    (SELECT Paese
    FROM Nazionale
    WHERE Continente = ‘Europa’)
    and
    Squadra2 not in
    (SELECT Paese
    FROM Nazionale
    WHERE Continente = ‘Europa’)

    Questa soluzione è SCORRETTA perchè non restituisce tutti gli stadi in cui giocano sempre due squadre non europee (che è ciò che viene chiesto nella domanda), ma restituisce quegli stadi in cui almeno una volta giocano due squadre non europee. Se avessimo nella tabella Incontro le seguenti due tuple :

    <'Olimpico','2009-07-26','18:00:00','Italia','Germania'>
    <'Olimpico','2009-07-26','22:00:00','Brasile','Argentina'>

    l'interrogazione inserirebbe erroneamente lo stadio 'Olimpico' nel risultato, nonostante alle 18:00 si giochi Italia-Germania

    La seconda soluzione che analizziamo è la seguente :

    SELECT distinct NomeStadio
    FROM Incontro, Nazionale
    WHERE Continente <> ‘Europa’ and (Squadra1=Paese or Squadra2=Paese)

    Anche questa soluzione è SCORRETTA perchè non restituisce tutti gli stadi in cui giocano sempre due squadre non europee, ma restituisce quegli stadi in cui una almeno una volta una delle due squadre che gioca deve essere non europea Se avessimo nella tabella Incontro la seguente tupla:

    <'Olimpico','2009-07-26','18:00:00','Italia','Brasile'>

    il JOIN sarebbe erroneamente soddisfatto da (Squadra2=Paese)
    avatar
    io


    Femmina
    Numero di messaggi : 2
    Età : 37
    Occupazione/Hobby : studente
    Data d'iscrizione : 27.04.09

    [7 ESERCITAZIONE] - Esercizio d'esame su SQL Empty Re: [7 ESERCITAZIONE] - Esercizio d'esame su SQL

    Messaggio Da io Lun Apr 27, 2009 11:43 am

    Buongiorno Professore,
    non riesco a capire perchè questo tipo di soluzione mi dà come risultato l'insieme vuoto:

    SELECT DISTINCT I.NomeStadio
    FROM Incontro I
    WHERE NOT EXISTS (SELECT *
    FROM Nazionale N
    WHERE N.Continente='Europa' AND I.Squadra1=N.Paese OR I.Squadra2=N.Paese)
    avatar
    A.Marrella
    Admin


    Maschio
    Numero di messaggi : 72
    Età : 41
    Occupazione/Hobby : Tutor
    Data d'iscrizione : 26.02.09

    [7 ESERCITAZIONE] - Esercizio d'esame su SQL Empty Re: [7 ESERCITAZIONE] - Esercizio d'esame su SQL

    Messaggio Da A.Marrella Lun Apr 27, 2009 11:53 am

    Salve,
    le viene mostrato l'insieme vuoto solo per una questione di precedenza tra operatori.
    Quando lei scrive :

    N.Continente='Europa' AND I.Squadra1=N.Paese OR I.Squadra2=N.Paese

    SQL non fissa una priorità rispetto agli operatori AND e OR....la soluzione è quella di indurre la priorità tramite parentesi, ad esempio scrivendo:

    SELECT DISTINCT I.NomeStadio
    FROM Incontro I
    WHERE NOT EXISTS (SELECT *
    FROM Nazionale N
    WHERE N.Continente='Europa' AND (I.Squadra1=N.Paese OR I.Squadra2=N.Paese)
    );
    avatar
    io


    Femmina
    Numero di messaggi : 2
    Età : 37
    Occupazione/Hobby : studente
    Data d'iscrizione : 27.04.09

    [7 ESERCITAZIONE] - Esercizio d'esame su SQL Empty Re: [7 ESERCITAZIONE] - Esercizio d'esame su SQL

    Messaggio Da io Lun Apr 27, 2009 11:58 am

    Facendo in questo modo si ottiene come risultato Franchi, SanNicola, SanPaolo e SanSiro e non SanPaolo e Granillo; forse per lo stesso problema che si presenta nel primo caso da lei esposto?
    avatar
    A.Marrella
    Admin


    Maschio
    Numero di messaggi : 72
    Età : 41
    Occupazione/Hobby : Tutor
    Data d'iscrizione : 26.02.09

    [7 ESERCITAZIONE] - Esercizio d'esame su SQL Empty Re: [7 ESERCITAZIONE] - Esercizio d'esame su SQL

    Messaggio Da A.Marrella Lun Apr 27, 2009 12:03 pm

    io ha scritto:Facendo in questo modo si ottiene come risultato Franchi, SanNicola, SanPaolo e SanSiro e non SanPaolo e Granillo; forse per lo stesso problema che si presenta nel primo caso da lei esposto?

    Si, esattamente. Il problema è molto simile alla query già analizzata in precedenza nel secondo post

    Contenuto sponsorizzato


    [7 ESERCITAZIONE] - Esercizio d'esame su SQL Empty Re: [7 ESERCITAZIONE] - Esercizio d'esame su SQL

    Messaggio Da Contenuto sponsorizzato


      La data/ora di oggi è Sab Apr 27, 2024 2:15 am