PDA

View Full Version : [SQL urgente] Problema a realizzare queste 2 query...aiuto esame dopodomani


D4rkAng3l
19-01-2008, 19:33
Sono un po' disperato perchè ho ancora qualche problema di query e tra due giorni ho l'esame di database :cry:

Vi prego di chiarirmi qualche dubbio.

Ho le seguenti tabelle:

PORTAEREI(nome_portaerei, anno_varo, numero_marinai)

AEREO(codice, anno_produzione, nome_portaerei)

PILOTA(matricola, nome, ore_di_volo, codice_aereo_pilotato)

ATTERRAGGIO(ID_atterragio, nome_portaerei, codice_aereo, data)

Allora le chiavi sono in grassetto, i vincoli di inegrità referenziale credo siano chiari dai nomi cmq AEREO è collegato a PORTAEREI mediante: nome_portaerei.

PILOTA è collegato ad AEREO tramite il codice dell'aereo.

ATTERRAGGIO è collegato ad AEREO e PORTAEREI tramite il nome della portaerei su cui un aereo atterra e il codice dell'aereo che atterra.

Le due query da realizzare che proprio non riesco a fare sono:

1) Elencare tutti i piloti che sono sulla stessa portaerei del pilota "Pippo".

2)Per ogni aereo si vuole sapere quante volte è atterrato su una portaerei diversa da quella di
appartenenza.

Per favore datemi una mano che devo capirci qualcosa entro Lunedì :cry:

Grazie
Andrea

D4rkAng3l
19-01-2008, 20:37
Oddio non ne esco credo che questa robba vada fatta usando gli ALIAS (select nidificate escluse a priori)

Qualcosa che mi viene in mente è tipo di fare qualcosa del genere:

[code]

SELECT X.nome
FROM PILOTA AS X, PILOTA AS Y, AEREO, PORTAEREI
WHERE Y.nome = 'Pippo'
AND Y.codice_aereo = AEREO.codice
AND AEREO.nome_portaerei = PORTAEREI.nome_portaerei

// Così facendo dovrei aver navigato per il db facendo vari join e dovrei aver trovato la portaerei sulla quale è stanziato il pilota Pippo ma ora non sò come collegarlo alla colonna X di tutti i piloti...stò alla frutta aiutatemi per favore :-(

D4rkAng3l
19-01-2008, 21:36
ops c'era un errorino scritto nelle tabelle...per favore datemi una mano...sono nel panico

cionci
20-01-2008, 08:13
Ad occhio dovrebbe andare, ma così hai fatto un mega tabellone ;)

Puoi usare le select annidate nel where ?

SELECT X.nome
FROM PILOTA, AEREO, PORTAEREI
WHERE PILOTA.codice_aereo = AEREO.codice
AND AEREO.nome_portaerei = (SELECT AEREO.nome_portaerei FROM PILOTA, AEREO WHERE nome = 'pippo' AND AEREO.codice_aereo = PILOTA.codice_aereo);

Sempre rispettando il modo tuo di dare i nomi e di fare la query.

Riguardando la tua query potresti risparmiarti la tabella PORTAEREI, visto che il nome della portaerei lo hai già in AEREO.

Comunque perché non ti crei le tabelle su Access e provi da lì a scrivere la query per vedere se torna ?

cionci
20-01-2008, 08:16
Riguardando la tua query non mi torna, bisogna anche costruire l'associazione fra il pilota di X ed il suo aereo, e solo a quel punto si può filtrare sullo stesso nome della portaerei:

SELECT X.nome
FROM PILOTA AS X, PILOTA AS Y, AEREO AS Z, AEREO AS K
WHERE Y.nome = 'Pippo'
AND Y.codice_aereo = Z.codice_aereo
AND X.codice_aereo = K.codice_aereo
AND K.nome_portaerei = Z.nome_portaerei;

D4rkAng3l
20-01-2008, 10:21
ti ringrazio...e circa l'altra query? anche quella mi crea problemi :cry:

Per ogni aereo si vuole sapere quante volte è atterrato su una portaerei diversa da quella di
appartenenza.

cionci
20-01-2008, 10:54
Per quello devi usare il group by...

newuser
20-01-2008, 14:34
select aereo.codice,
count(atterraggio.id_atterraggio)
froma aereo, atterraggio
where aereo.codice=atterraggio.codice_aereo
and aereo.nome_portaerei<>atterraggio.nome_portaerei
group by aereo.codiceCosì facendo mancano però gli aerei che non hanno fatto atterraggi su portaerei diverse da quella loro assegnata, è possibile aggiungerla usando gli alias.