/* \i 'H:\\0-BasidiDati_2024-25\\Moodle_2-SoluzioniDiEsercizi\\Aeroporti-2-CanaB_Query.sql' */ \qecho '\nB. Elencate i voli gestiti da un tipo sconosciuto di aereo.' /* NULL */ SELECT * FROM VOLI WHERE TipoAereo IS NULL; \qecho '\nC. Elencate i tipi di aereo usati nei voli che partono da Milano.' /* NULL */ SELECT DISTINCT TipoAereo FROM VOLI WHERE TipoAereo IS NOT NULL AND NomeCittaParte = 'Milano'; \qecho '\nD. Elencate gli stati dai quali partono voli che possono trasportare almeno 100 passeggeri.' /* JOIN con 3 relazioni */ /* Risolto da: Gianmarco Fossato */ /* CITTA contiene gli stati, TIPI_AEREI contiene le capienze. Il termine "distinct" evita ripetizioni dello stesso stato da cui partono piĆ¹ aerei con capienza >=100. */ SELECT DISTINCT C_P.Stato FROM (CITTA AS C_P JOIN VOLI AS V ON C_P.NomeCitta = V.NomeCittaParte) JOIN TIPI_AEREI AS TA ON V.TipoAereo = TA.TipoAereo WHERE TA.Capienza >= 100; \qecho '\nE.I Per il volo con identificativo 3,' \qecho ' elencate il giorno della settimana, lo stato di partenza e quello di arrivo.' /* SELF JOIN con 3 relazioni */ \qecho '\n\nE.1. Risolvete mediante Sql basico.' SELECT V.GiornoSetti, C_P.Stato, C_A.Stato FROM (VOLI AS V JOIN CITTA AS C_P ON V.NomeCittaParte = C_P.NomeCitta) JOIN CITTA AS C_A ON V.NomeCittaArri = C_A.NomeCitta WHERE V.IdeVolo = 3; \qecho '\nF. Elencate le coppie di citta` collegate da voli internazionali.' \qecho '\n\nF.1. Risolvete mediante Sql basico.' /* SELF JOIN con 3 relazioni */ /* Risolto da: Leonardo Ongaro */ SELECT DISTINCT V.NomeCittaParte, V.NomeCittaArri FROM (VOLI AS V JOIN CITTA AS C_P ON V.NomeCittaParte = C_P.NomeCitta) JOIN CITTA AS C_A ON V.NomeCittaArri = C_A.NomeCitta AND C_P.Stato <> C_A.Stato; \qecho '\nG. Indicate il numero di voli internazionali che partono la domenica da Milano.' /* COUNT */ /* Risolto da: Daniel Ginato e altri */ SELECT COUNT(*) FROM VOLI AS V JOIN CITTA AS C_A ON V.NomeCittaArri = C_A.NomeCitta WHERE V.NomeCittaParte = 'Milano' AND C_A.Stato <> 'ITA' AND V.GiornoSetti = 'DO'; \qecho '\nH. Per ogni citta` italiana, indicate il numero di voli internazionali in partenza.' \qecho '\ L''elenco deve contenere soltanto le citta` in cui questo numero e` > 0.' /* GROUP BY. */ /* Risolto da: Riccardo Marcuzzi */ SELECT V.NomeCittaParte, COUNT(*) FROM (VOLI AS V JOIN CITTA AS C_P ON V.NomeCittaParte = C_P.NomeCitta) JOIN CITTA AS C_A ON V.NomeCittaArri = C_A.NomeCitta WHERE C_P.Stato = 'ITA' AND C_A.Stato <> 'ITA' GROUP BY V.NomeCittaParte; \qecho '\nI. Elencate le citta` francesi da cui partono almeno due voli alla settimana diretti in ITA.' /* HAVING. */ /* Risolto da: Riccardo Marcuzzi */ SELECT V.NomeCittaParte FROM (VOLI AS V JOIN CITTA AS C_P ON V.NomeCittaParte = C_P.NomeCitta) JOIN CITTA AS C_A ON V.NomeCittaArri = C_A.NomeCitta WHERE C_P.Stato = 'FRA' AND C_A.Stato = 'ITA' GROUP BY V.NomeCittaParte HAVING COUNT(*) >= 20; \qecho '\nJ. Elencate le citta` da cui partono voli diretti a Milano, ordinate alfabeticamente.' /* ORDER BY */ /* Risolto da: */ SELECT DISTINCT NomeCittaParte FROM VOLI WHERE NomeCittaArri = 'Milano' ORDER BY NomeCittaParte; \qecho '\nK. Elencate ogni citta` che e` collegata a Roma (mediante un volo che parte da Roma o ci arriva).' \qecho 'L''elenco deve avere un''unica colonna.' /* UNION. */ /* Risolto da: Alberto Parravicini */ /* Citta` dalle quali parte un volo diretto a Roma. */ SELECT DISTINCT V.NomeCittaParte AS NomeCittaCollegataARoma FROM VOLI AS V WHERE V.NomeCittaArri = 'Roma' UNION /* Citta` nelle quali arriva un volo partito da Roma. */ SELECT DISTINCT V.NomeCittaArri FROM VOLI AS V WHERE V.NomeCittaParte = 'Roma'; \qecho '\nL. Elencate le citta` collegate soltanto mediante voli effettuati la domenica.' \qecho 'L''elenco deve avere un''unica colonna. Non usate join.' /* EXCEPT, UNION. */ DELETE FROM VOLI; INSERT INTO VOLI(GiornoSetti, NomeCittaParte, NomeCittaArri, TipoAereo) VALUES('DO', 'Milano', 'Paris', 'A'); INSERT INTO VOLI(GiornoSetti, NomeCittaParte, NomeCittaArri, TipoAereo) VALUES('DO', 'Milano', 'Roma', 'B'); INSERT INTO VOLI(GiornoSetti, NomeCittaParte, NomeCittaArri, TipoAereo) VALUES('LU', 'Paris', 'Roma', 'C'); INSERT INTO VOLI(GiornoSetti, NomeCittaParte, NomeCittaArri, TipoAereo) VALUES('DO', 'Milano', 'Venezia', 'B'); \qecho '\nDati usati per il test:\n' SELECT * FROM CITTA; SELECT * FROM VOLI; \qecho '\nM. Per ogni volo che parte da Milano,' \qecho ' elencate la citta` di arrivo e, se sono disponibili, il tipo e la capienza dell''aereo.' /* JOIN ESTERNO */ /* Risolto da: */ SELECT V.IdeVolo, V.NomeCittaArri, TA.TipoAereo, TA.Capienza FROM VOLI AS V LEFT JOIN TIPI_AEREI AS TA ON V.TipoAereo = TA.TipoAereo WHERE V.NomeCittaParte = 'Milano';