UPDATE & JOIN avec SQL/FIREBIRD

RV2931 Messages postés 185 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 16 juillet 2016 - 6 oct. 2011 à 20:36
galled Messages postés 41 Date d'inscription vendredi 30 octobre 2009 Statut Membre Dernière intervention 13 décembre 2012 - 7 oct. 2011 à 21:56
Bonjour,

J'aurai besoin de faire un truc un peu compliqué avec 2,3 tables. Je ne vois pas trop comment car apparemment, Firebird ne gère pas les UPDATE multitables.
Ma base concerne un aéroport.
Il y a l'environnement, c'est à dire l'aéroport dans lequel on se trouve, LFPG pour Paris par exemple. Il y a des avions avec une type avions (B777 pou un boeing 777...) et un plan de vol appelé "Flightplan" qui contient toute les information concernant le vol, notamment son poids.
Un type d'avions donné à un poids à vide, un poids maximum au décollage MAXTO (pour take off) et un poids maximum à l'atterissage MAXLG (Pour landing)

J'ai donc 3 tables ENVIRONMENTS, FLIGHTPLANS, AIRCRAFTS
ENVIRONMENTS contient l'information une clé ENVIRONMENTS.ID associé au nom textuel de l'environnement ENVIRONMENTS.NAME
FLIGHTPLANS contient le type d'avion TYPE et le poids donné arbitrairement à un avion (c'est un simulateur) (clé, index ID unique du plan de vol)
AIRCRAFTS contient toutes les informations physiques et limites, normes et autres pour chaque type TYPE d'avions pouvant être utilisés dans les FLIGHTPLANS. (clé, index ID unique du type avion)

FLIGHTPLANS.TYPE étant forcément contenu dans la liste des AIRCRAFTS.ID
FLIGHTPLANS.ENV étant l'index de l'environnement dont le nom textuel est donné par ENVIRONMENTS.NAME avec FLIGHTPLANS.ENV = ENVIRONMENTS.ID
FLIGHTPLAN.WEIGHT étant le poids de l'avion en pourcentage de la différence WEIGHTMAXTO - WEIGHTEMPTY
Ce qui veut dire que WEIGHT 0> WEIGHTEMPTY et WEIGHT = 100 => WEIGHTMAXTO
FLIGHTPLAN.ADEP étant l'aéroport de départ, égal à ENVIRONMENTS.NAME si c'est un départ.
FLIGHTPLAN.ADES étant l'aéroport de desctination, égal à ENVIRONMENTS.NAME si c'est une arrivée.
AIRCRAFTS.WEIGHTEMPTY,AIRCRAFTS.WEIGHTMAXLG et AIRCRAFTS.WEIGHTMAXTO étant respectivement le poids à vide, maximum à l'atterrissage et maximum au décollage.

Mon but est d'affecter des poids cohérents, aléatoirement compris entre WEIGHTEMPTY et WEIGHTMAXTO pour un vol au départ (FLIGHTPLAN.ADES = ENVIRONMENTS.NAME)
et d'affecter des poids cohérents, aléatoirement compris entre WEIGHTEMPTY et WEIGHTMAXLG pour un vol à l'arrivée.

Pour l'instant, j'ai 3 requêtes :
/* Met un poids compris entre 70 et 100% pour les départs. */
UPDATE FLIGHTPLANS
SET WEIGHT = cast(70+RAND()*30 AS integer)
WHERE FLIGHTPLANS.ID IN (
SELECT FLIGHTPLANS.ID
FROM FLIGHTPLANS
JOIN AIRCRAFTS
ON FLIGHTPLANS.TYPE = AIRCRAFTS.ID
JOIN ENVIRONMENTS
ON FLIGHTPLANS.ENV = ENVIRONMENTS.ID
WHERE FLIGHTPLANS.ADEP = ENVIRONMENTS.NAME
}

/* Met un poids compris entre 10 et 50% pour les arrivées. */
UPDATE FLIGHTPLANS
SET WEIGHT cast(10+RAND()*40 AS integer) /*> valeurs arbitraires, comment faire pour récupérer le WEIGHTMAXLG de AIRCRAFTS */
WHERE FLIGHTPLANS.ID IN (
SELECT FLIGHTPLANS.ID
FROM FLIGHTPLANS
JOIN AIRCRAFTS
ON FLIGHTPLANS.TYPE = AIRCRAFTS.ID
JOIN ENVIRONMENTS
ON FLIGHTPLANS.ENV = ENVIRONMENTS.ID
WHERE FLIGHTPLANS.ADES = ENVIRONMENTS.NAME
}


Mon but serait plutôt que d'allouer une valeur aléatoire comprise entre deux bornés MIN (10%) MAX (50%) arbitraires, je voudrais affecter une valeur comprise entre MIN (10%) et MAX = la valeur de WEIGHTMAXLG du type de l'avion concerné par le plan de vol.

J'ai essayé des
UPDATE FLIGHTPLANS
JOIN AIRCRAFTS
ON FLIGHTPLANS.TYPE = AIRCRAFTS.ID
JOIN ENVIRONMENTS
ON FLIGHTPLANS.ENV = ENVIRONMENTS.ID
SET WEIGHT =  cast(10+RAND()*(WEIGHTMAXLG - 10) AS integer)
WHERE FLIGHTPLANS.ADES = ENVIRONMENTS.NAME

et différentes variante que j'ai pu trouver sur les forums, mais rien en semble fonctionner. Pour celui-ci, l'erreur est Dynamic SQL error code = -104 - Token unknown - line 2, column 1 - JOIN Could not prepare statement

Je fais que commencer le SQL pour info...

Merci d'avoir lu

Hervé

L'intelligence est la chose la mieux répartie chez l'homme, car quoi qu'il en soit pourvu, il a toujours l'impression d'en avoir assez. "Descartes"
A voir également:

1 réponse

galled Messages postés 41 Date d'inscription vendredi 30 octobre 2009 Statut Membre Dernière intervention 13 décembre 2012
7 oct. 2011 à 21:56
Bonjour,

Je ne sais pas si ça fonction avec a base de données., mais tu peux sans doute faire un truc comme

UPDATE FLIGHTPLANS
SET WEIGHT = cast(10+RAND() * (SELECT max(TON_POID_DAVION) FROM LE RESTE... )A INTEGER)
WHERE FLIGHTPLANS.ADES = ENVIRONMENTS.NAME
0