zanardi84
23-10-2012, 10:32
Ho uno schema così composto:
AEREI(aereo PK, posti)
AEROPORTI(id PK, città)
VOLI(numero PK, Partenza FK, Arrivo, FK, aereo FK)
dove PK indica la chiave primaria ed FK la chiave esterna. Partenza e Arrivo si riferiscono alla chiave primaria di AEROPORTI, mentre aereo a quella di AEREO.
Devo trovare la coppia di città tra le quali viene offerta la maggiore capacità complessiva di trasporto passeggeri.
La mia soluzione fa uso di due viste (poi posto il codice):
La prima, per ogni tratta di sola andata, somma i posti.
La seconda, effettuando una query sulla prima, riconosce la tratta di rientro (self join dove la partenza della prima tabella è l'arrivo della seconda e l'arrivo della prima è la partenza della seconda) e poi somma i posti di ogni tratta.
Il valore massimo della somma è quello desiderato e lo ottengo con una query sulla seconda vista.
create view sommaPosti(partenza, arrivo, somma) as
select a.città, b.città, sum(aerei.posti)
from voli, aerei, aeroporti a, aeroporti b
where voli.aereo = aerei.aereo and voli.partenza = a.idaeroporti and voli.arrivo = b.idaeroporti
group by voli.partenza, voli.arrivo;
create view postiComplessivi as
select a.partenza as Pandata, a.arrivo Parrivo, a.somma as postiAndata, b.partenza as Rpartenza, b.arrivo as Rarrivo, b.somma as postiRitorno, a.somma+b.somma as totale
from sommaPosti a, sommaPosti b
where a.partenza = b.arrivo and a.arrivo = b.partenza
select Pandata, Rpartenza, max(totale)
from postiComplessivi
Ci sono alternative, magari migliori rispetto alla mia?
AEREI(aereo PK, posti)
AEROPORTI(id PK, città)
VOLI(numero PK, Partenza FK, Arrivo, FK, aereo FK)
dove PK indica la chiave primaria ed FK la chiave esterna. Partenza e Arrivo si riferiscono alla chiave primaria di AEROPORTI, mentre aereo a quella di AEREO.
Devo trovare la coppia di città tra le quali viene offerta la maggiore capacità complessiva di trasporto passeggeri.
La mia soluzione fa uso di due viste (poi posto il codice):
La prima, per ogni tratta di sola andata, somma i posti.
La seconda, effettuando una query sulla prima, riconosce la tratta di rientro (self join dove la partenza della prima tabella è l'arrivo della seconda e l'arrivo della prima è la partenza della seconda) e poi somma i posti di ogni tratta.
Il valore massimo della somma è quello desiderato e lo ottengo con una query sulla seconda vista.
create view sommaPosti(partenza, arrivo, somma) as
select a.città, b.città, sum(aerei.posti)
from voli, aerei, aeroporti a, aeroporti b
where voli.aereo = aerei.aereo and voli.partenza = a.idaeroporti and voli.arrivo = b.idaeroporti
group by voli.partenza, voli.arrivo;
create view postiComplessivi as
select a.partenza as Pandata, a.arrivo Parrivo, a.somma as postiAndata, b.partenza as Rpartenza, b.arrivo as Rarrivo, b.somma as postiRitorno, a.somma+b.somma as totale
from sommaPosti a, sommaPosti b
where a.partenza = b.arrivo and a.arrivo = b.partenza
select Pandata, Rpartenza, max(totale)
from postiComplessivi
Ci sono alternative, magari migliori rispetto alla mia?