IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Problématique un peu tordue dans une requête


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 37
    Points : 37
    Points
    37
    Par défaut Problématique un peu tordue dans une requête
    Tout d'abord bonjour à tous, je viens poster ici en désespoir de cause, car après des heures de recherche avec la documentation je ne trouve pas LA solution me permettant de m'affranchir de mon souci.

    J'explique la situation:
    BDD: Sybase
    Requête: Pour procédure stockée SQL

    Admettons deux tables T1 et T2.
    - T1 contient toujours l'enregistrement dont j'ai besoin (car je le retrouve via un ID dont je suis certain)
    - T2 contient de 0 à n lignes

    la jointure est sur un champ nommé ID_USER.
    Je souhaite retourner un champ nommé DATE_TRT dans T2... seulement celui-ci est dupliqué et ma règle de gestion m'impose de récupérer la valeur MAXI de cette DATE_TRT... donc si possible une seule ligne.

    La requête que j'ai tentée est la suivante (en admettant que mon ID_USER recherché soit 1000):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Select T1.ID_USER, T1.LOGIN, T2.DATE_TRT 
    From T1 JOIN T2 ON T1.ID_USER = T2.ID_USER 
    where 
    T1.DATE_TRT = (Select max(DATE_TRT) From T2 where ID_USER = 1476)
    AND T1.ID_USER = 1476
    Cela fonctionne si T2 n'est pas absent.

    Essayons avec le outer join : si je laisse la condition 'MAX' je ne retourne rien pour un autre ID (1813) qui lui n'a pas de données dans T2. Logique... mais que faire pour conserver malgré tout ce MAX, ou bien le mettre ailleurs?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Select T1.ID_USER, T1.LOGIN, T2.ACTION_DATE
    From T1 LEFT OUTER JOIN T2 ON T1.ID_USER = T2.ID_USER --AND T2.ID_USER IS NULL
    where 
    T2.ACTION_DATE = (select MAX(T2.DATE_TRT) From T2 where T2.ID_USER = 1813) AND
    T1.ID_USER = 1813
    J'espère avoir été suffisamment clair dans mes explications...
    En tout ca cela ne fonctionne pas totalement: si je sélectionne le MAX de la date pour en avoir un seule cela passe quand elle existe, si je ne place pas le max et que je maintiens une jointure en outer join (pour récupérer les autres cas), alors je n'ai plus cette notion de valeur maxi.

    NOTA: la partie en commentaires, qu'elle soit active ou non ne m'aide pas du tout c'est à dire que je ne retourne pas les bonnes données...

    HELP!

  2. #2
    Membre éprouvé Avatar de Mathusalem
    Profil pro
    IT moa
    Inscrit en
    Décembre 2003
    Messages
    1 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : IT moa

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 008
    Points : 1 067
    Points
    1 067
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT T1.ID_USER, T1.LOGIN, T2.DATE_TRT 
    FROM T1 JOIN T2 ON T1.ID_USER = T2.ID_USER 
    WHERE 
    T1.DATE_TRT = ISNULL((SELECT max(DATE_TRT) FROM T2 WHERE ID_USER = 1476)
    AND T1.ID_USER = 1476),T1.DATE_TRT)
    et qqch comme ça ? (pas testé)

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 37
    Points : 37
    Points
    37
    Par défaut
    Citation Envoyé par Mathusalem
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT T1.ID_USER, T1.LOGIN, T2.DATE_TRT 
    FROM T1 JOIN T2 ON T1.ID_USER = T2.ID_USER 
    WHERE 
    T1.DATE_TRT = ISNULL((SELECT max(DATE_TRT) FROM T2 WHERE ID_USER = 1476)
    AND T1.ID_USER = 1476),T1.DATE_TRT)
    et qqch comme ça ? (pas testé)
    Déjà essayé quelque chose dans le genre mais ça ne fonctionnait pas, peut être que ma syntaxe était ratée. De plus, avec ce modèle là je crains des perfs inacceptables... mais je vais me répondre à moi-même^^

    Voici la solution qui en tout cas fonctionne à tous les coups!

    J'ai fait ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Select T1.ID_USER, 
         (Select MAX(DATE_TRT) FROM T2 
          where T2.ID_USER = 1476) As DATE_TRT 
    FROM 
    T1 WHERE T1.ID_USER = 1476
    Après analyse, le MAX retourne NULL si le champ n'est pas présent... donc de fait j'ai toujours la bonne donnée quelque soit la valeur en entrée

    En tout cas ça fonctionne sous SYBASE.

    Merci de ton aide en tout cas

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Différence entre majuscule et minuscule dans une requête
    Par Asdorve dans le forum Langage SQL
    Réponses: 2
    Dernier message: 23/06/2004, 15h42
  2. Utilisation de MAX dans une requête SQL
    Par Evil onE dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/06/2004, 19h38
  3. calcul dans une requête
    Par blaz dans le forum Langage SQL
    Réponses: 8
    Dernier message: 22/12/2003, 11h31
  4. [SQL] Renommer un champ dans une requête
    Par martonpylon12 dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 15/11/2003, 02h59
  5. petit probleme dans une requte POSTGRE SQL
    Par ghis le fou dans le forum Requêtes
    Réponses: 5
    Dernier message: 08/09/2003, 14h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo