Requête sql

Bonjour,
Etant une quiche en SQL, et ayant pas mal cherché, je coince sur quelque chose qui va vous sembler d’une simplicité enfantine.
J’ai deux tables :

  • TM04_INFORMATION_RAME

    • colonne 1 : numero_rame (pk, varchar2)
    • colonne 2 : etat (number)
    • colonne 3 : date_dernier_msg (timestamp(6) )
  • TM04_CIRCULATION_THEORIQUE

    • ID (pk, number),
    • numero_rame (fk, ref TM04_INFORMATION_RAME.numero_rame),
    • date_debut_theo : timestamp(6)
    • date_fin_theo : timestamp(6)

TM04_INFORMATION_RAME stocke des informations d’une rame issus de flux xml ainsi que la date du dernier message recu.
Je souhaite, pour toutes ces rames, avec l’etat 1-2 récupérer les circulations théoriques.
Jusque la pas de soucis.
Maintenant, je ne souhaite récupérer QUE la circulation théorique la plus proche de la date du dernier message recu pour cette rame.
Exemple :

  • j’ai une rame, la 301, avec l’état 1, son dernier message est aujourd’hui, 12:00:00
  • cette rame à 3 circulations théoriques ce jour la :
    • la 1ere : de 11:00:00 à 11:30
    • la 2eme : à 15:00 à 16:00
    • la 3eme : à 17:00 :18:30

Ma requête devra donc ne récupérer QUE la 2ème, car la 1ère est déja passée (ça, j’arrive à la jeter), et la 3 ème est plus lointaine que la deuxième.
Il faudrait aussi que ce soit aussi le cas lorsque la date du dernier message recu soit compris dans l’une de ses circulations.
On m’a imposé le fait que tout cela doit être fait en one shot (une seule requête) … c’est en fait ce qui me pose problème :frowning:
Votre aide serait vraiment appréciable :jap:

Je verrais bien un truc du genre suivant:

SELECT *
FROM TM04_CIRC C
JOIN TM04_INF I ON C.numero_rame = I.numero_rame
AND I.numero_rame = ‘numero de la rame’
WHERE I.date_dernier_msg <= C.date_debut_theo
ORDER BY (C.date_debut_theo - I.date_dernier_msg) ASC
LIMIT 1

aux erreurs de syntaxe pres ca devrait passer, apres tu peux remplacer le JOIN par une condition supplémentaire sur le where. Mais la requete devrait faire la chose suivante:
D’abord ca fait le produit cartesion entre tes 2 tables
Ensuite ca filtre sur le numero de ram
Ensuite ca vire tous les trucs qui sont deja passé
Ensuite ca fait un ordonnancement par date d eloignement
Et ca limite le resultat a 1

si ca marche pas essaye le truc suivant:

SELECT * FROM (
SELECT C.date_debut_theo - I.date_dernier_msg as eloignement_dans_le_temps, *
FROM TM04_CIRC C
JOIN TM04_INF I ON C.numero_rame = I.numero_rame
AND I.numero_rame = ‘numero de la rame’
WHERE I.date_dernier_msg <= C.date_debut_theo
) as tmp
ORDER BY eloignement_dans_le_temps
LIMIT 1

Enfin un truc du genre ^^. Si ca marche pas je remonterais mon serveur pour te filer la syntaxe complete dis moi juste le type de base que t utilises parce qu il peut y avoir des raccourcis (IE: <= ALL dans les conditions)

Cordialement,

EDIT: corrigé :slight_smile: merci deltree
Et s il veut ce resultat pour toutes les rames bah faut revoir la requete :slight_smile:
Edité le 19/03/2008 à 10:22

En fait c’est l’heure de prochain passage d’une rame?
pour toutes les rames ou une seule?

Parce qu’avec la requête d Chryso, on ne retourne qu’une valeur
(et moi j’aurais mis <= et pas >= ) :wink: