Italian [risolto] solved help Creazione di 2 " semplici " query

Xfood

Expert
Licensed User
buongiorno ragazzi,
mi serve estrarre dei dati da 3 tabelle ,
quale migliore query posso utilizzare?

ho queste 3 tabelle
TABELLA Aeroporto
CodiceAr Citta Nazione
CAL CAGLIARI ITALIA
FCO ROMA FIUMICINO ITALIA
CTA CATANIA ITALIA
MPX MILANO MALPENSA ITALIA
TRN TORINO ITALIA
PAR PARIGI FRANCIA


TABELA VOLO
IDVOLO CODICEVOLO CODICEARPARTENZA CODICEARARRIVO IDAEREO
1 AZ297 CTA FCO 1
2 AZ273 TRN CTA 2
3 AZ285 MPX PAR 3
4 AZ296 TRN FCO 4
5 AZ298 FCO PAR 5


TABELLA AEREO
IDAEREO TIPOAEREO
1 BOING
2 AIRBUS
3 AEREOX
4 AEREOY
5 AEREOX

il quesito che mi serve e'
1) i tipi di aereo usati nei voli che partono da torino

2) le nazioni da cui parte e arriva il volo AZ298


qualcuno mi puo' indicare per favore come creare queste due query in maniera ottimale?
Grazie e buona domenica
 

Lello1964

Well-Known Member
Licensed User
Longtime User
ho fatto la do manda a chatgpt, ecco la risposta (non controllata):


B4X:
SELECT Aereo.TipoAereo
FROM Aereo
JOIN Volo ON Aereo.IDAerEO = Volo.IDAerEO
WHERE Volo.CodiceArPartenza = 'TRN';

B4X:
SELECT AeroportoPartenza.Nazione AS NazionePartenza, AeroportoArrivo.Nazione AS NazioneArrivo
FROM Aeroporto AS AeroportoPartenza
JOIN (
  SELECT CodiceArPartenza, CodiceArArrivo
  FROM Volo
  WHERE CodiceVolo = 'AZ298'
) AS VoloInfo
ON VoloInfo.CodiceArPartenza = AeroportoPartenza.CodiceAr
JOIN Aeroporto AS AeroportoArrivo
ON VoloInfo.CodiceArArrivo = AeroportoArrivo.CodiceAr;
 

LucaMs

Expert
Licensed User
Longtime User
come creare queste due query in maniera ottimale?
Usare un tool che consenta di generare query in maniera grafica, ovvero trascinando tabelle-campi, partendo dalla struttura relazionale.

Per SQLite non ne conosco (e tra poco mi "divertirò" a cercarne, ma mi sembra di averlo già fatto in passato, senza successo).
Al limite fallo con MS Access

Se, invece, la domanda fosse: "come devono essere le query?"... te lo direi successivamente 😁
 

Lello1964

Well-Known Member
Licensed User
Longtime User
in una sola query :

B4X:
WITH VoloInfo AS (
  SELECT CodiceArPartenza, CodiceArArrivo
  FROM Volo
  WHERE CodiceVolo = 'AZ298'
),
AeroportoPartenza AS (
  SELECT CodiceAr, Nazione
  FROM Aeroporto
  WHERE CodiceAr = (SELECT CodiceArPartenza FROM VoloInfo)
),
AeroportoArrivo AS (
  SELECT CodiceAr, Nazione
  FROM Aeroporto
  WHERE CodiceAr = (SELECT CodiceArArrivo FROM VoloInfo)
)
SELECT (SELECT Nazione FROM AeroportoPartenza) AS NazionePartenza,
       (SELECT Nazione FROM AeroportoArrivo) AS NazioneArrivo,
       (SELECT TipoAereo FROM Aereo JOIN Volo ON Aereo.IDAerEO = Volo.IDAerEO WHERE Volo.CodiceArPartenza = 'TRN') AS TipoAereoUsatoPerVoliDaTorino
 

Xfood

Expert
Licensed User
in una sola query :

B4X:
WITH VoloInfo AS (
  SELECT CodiceArPartenza, CodiceArArrivo
  FROM Volo
  WHERE CodiceVolo = 'AZ298'
),
AeroportoPartenza AS (
  SELECT CodiceAr, Nazione
  FROM Aeroporto
  WHERE CodiceAr = (SELECT CodiceArPartenza FROM VoloInfo)
),
AeroportoArrivo AS (
  SELECT CodiceAr, Nazione
  FROM Aeroporto
  WHERE CodiceAr = (SELECT CodiceArArrivo FROM VoloInfo)
)
SELECT (SELECT Nazione FROM AeroportoPartenza) AS NazionePartenza,
       (SELECT Nazione FROM AeroportoArrivo) AS NazioneArrivo,
       (SELECT TipoAereo FROM Aereo JOIN Volo ON Aereo.IDAerEO = Volo.IDAerEO WHERE Volo.CodiceArPartenza = 'TRN') AS TipoAereoUsatoPerVoliDaTorino
diciamo mi sembra un po troppo complessa, ma io non ho ilcodice aeroporto ho la citta nel caso specifico torino, quindi devo ricavare anche il codice TRN
 

Lello1964

Well-Known Member
Licensed User
Longtime User
Se non hai il codice aeroporto, ma solo la città di partenza, è necessario unirsi alla tabella "Aeroporto" per ottenere il codice aeroporto corrispondente. Ecco una query che fa questo:

B4X:
WITH VoloInfo AS (
  SELECT CodiceArPartenza, CodiceArArrivo
  FROM Volo
  WHERE CodiceVolo = 'AZ298'
),
AeroportoPartenza AS (
  SELECT CodiceAr, Nazione
  FROM Aeroporto
  WHERE Citta = 'TORINO'
),
AeroportoArrivo AS (
  SELECT CodiceAr, Nazione
  FROM Aeroporto
  WHERE CodiceAr = (SELECT CodiceArArrivo FROM VoloInfo)
)
SELECT (SELECT Nazione FROM AeroportoPartenza) AS NazionePartenza,
       (SELECT Nazione FROM AeroportoArrivo) AS NazioneArrivo,
       (SELECT TipoAereo FROM Aereo JOIN Volo ON Aereo.IDAerEO = Volo.IDAerEO WHERE Volo.CodiceArPartenza = (SELECT CodiceAr FROM AeroportoPartenza)) AS TipoAereoUsatoPerVoliDaTorino
 

Xfood

Expert
Licensed User
Sì ma anche se fossi espertissimo, con un tool apposito fai prima e senza errori, oltre a verificare subito il risultato.
devo scaricare e installare uno dei tools consigliati da te, e vediamo cosa riesco ad estrapolare
 

LucaMs

Expert
Licensed User
Longtime User
MS Access

1676194059814.png


SELECT Aereo.TipoAereo, Volo.CodicePartenza
FROM Aeroporto INNER JOIN (Aereo INNER JOIN Volo ON Aereo.IDAereo = Volo.IDAereo) ON Aeroporto.CodiceAr = Volo.CodicePartenza
WHERE (((Volo.CodicePartenza)="TRN"));


(Non ho controllato se vada bene; devo ancora fare colazione :) . NOTA: non ho scritto io la query; ho impostato le relazioni tra le tabelle e messo il criterio "TRN")
 

Lello1964

Well-Known Member
Licensed User
Longtime User
Sì, questa query risponde alla domanda iniziale "i tipi di aereo usati nei voli che partono da Torino".

L'unione tra le tabelle "Aeroporto", "Aereo" e "Volo" consente di ottenere tutte le informazioni richieste. Il filtro sulla colonna "CodicePartenza" impostato su "TRN" garantisce che vengano restituiti solo i voli che partono da Torino.

Tuttavia, questa query non risponde alla seconda parte della domanda "le nazioni da cui parte e arriva il volo AZ298". Per ottenere queste informazioni, è necessario un'altra query.
 

Xfood

Expert
Licensed User
MS Access

View attachment 139188

SELECT Aereo.TipoAereo, Volo.CodicePartenza
FROM Aeroporto INNER JOIN (Aereo INNER JOIN Volo ON Aereo.IDAereo = Volo.IDAereo) ON Aeroporto.CodiceAr = Volo.CodicePartenza
WHERE (((Volo.CodicePartenza)="TRN"));


(Non ho controllato se vada bene; devo ancora fare colazione :) . NOTA: non ho scritto io la query; ho impostato le relazioni tra le tabelle e messo il criterio "TRN")
questa mi sembra piu sempice come soluzione, solo che bisogna integrare un'altra tabella ,
visto che ho il nome dell'aeroporto e non il codice, quindi anche il TRN deve essere ricavato dalla query.
 

Xfood

Expert
Licensed User
Sì, questa query risponde alla domanda iniziale "i tipi di aereo usati nei voli che partono da Torino".

L'unione tra le tabelle "Aeroporto", "Aereo" e "Volo" consente di ottenere tutte le informazioni richieste. Il filtro sulla colonna "CodicePartenza" impostato su "TRN" garantisce che vengano restituiti solo i voli che partono da Torino.

Tuttavia, questa query non risponde alla seconda parte della domanda "le nazioni da cui parte e arriva il volo AZ298". Per ottenere queste informazioni, è necessario un'altra query.
esatto, mi servono 2 query
 

LucaMs

Expert
Licensed User
Longtime User
Sì, questa query risponde alla domanda iniziale "i tipi di aereo usati nei voli che partono da Torino".

L'unione tra le tabelle "Aeroporto", "Aereo" e "Volo" consente di ottenere tutte le informazioni richieste. Il filtro sulla colonna "CodicePartenza" impostato su "TRN" garantisce che vengano restituiti solo i voli che partono da Torino.

Tuttavia, questa query non risponde alla seconda parte della domanda "le nazioni da cui parte e arriva il volo AZ298". Per ottenere queste informazioni, è necessario un'altra query.
Lo so, ma lo stomaco richiedeva cibo 😁 ed era più urgente.

Quello era solo per mostrare quanto sia più facile far generare una query ad un tool, anziché impiccarsi con le JOIN a manina.
 

LucaMs

Expert
Licensed User
Longtime User
Intanto la prima, più "precisamente" è così:

SELECT Aereo.TipoAereo, Aeroporto.Citta
FROM Aeroporto INNER JOIN (Aereo INNER JOIN Volo ON Aereo.IDAereo = Volo.IDAereo) ON Aeroporto.CodiceAr = Volo.CodicePartenza
WHERE (((Volo.CodicePartenza)="TRN"));

in esecuzione:
1676195647761.png


Adesso, con calmina, guardo la seconda rischiesta
 
Top