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 :

Requête un peu trop compliqué pour moi


Sujet :

Langage SQL

  1. #1
    Membre du Club Avatar de Kokito
    Homme Profil pro
    Inscrit en
    Février 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2004
    Messages : 78
    Points : 56
    Points
    56
    Par défaut Requête un peu trop compliqué pour moi
    Bonjour à tous

    J'ai une requête assez compliqué à faire, ca fait 2 jours que j'y suis dessus et je commence à perdre patience donc je viens demander de l'aide

    Je schématise car j'ai des tables avec des 40aines de champ !

    Table T1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ID_T1 | Nom
    ------|------
      1   | Pomme
      2   | Poire
    Table T2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ID_T2 | T1 |   Debut    |    Fin
    ------|----|------------|----------
      1   | 1  | 2005/01/10 | 2005/02/20
      2   | 1  | 2005/02/23 | 2005/03/10
      3   | 1  | 2005/03/13 | 2005/04/10
    Voilà c'est très schématisé, mon problème : (enfin j'espère que ca ne vient que de là ).

    Je fais une opération dans mon SELECT sur la date la plus récente qui se trouve dans T2 pour la Pomme comme ca (j'ajoute 2 jours à la date Debut et je vérifie qu'elle est plus petite ou égale à la date du jour) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CONVERT(varchar, DATEADD(d, 4, CONVERT(datetime, T2.Debut, 121)), 111) <= CONVERT(varchar, GETDATE(), 111)
    En fait, je voudrais effectuer seulement cette opération sur la date la plus récente, les autres dates, c'est juste de l'historique car évidemment les autres dates moins récentes sont affichées dans ma requête vu qu'elles vérifient la condition.

    Si j'utilise TOP 1 (pour SQL Server), ca va me donner seulement 1 seul résultat mais moi je voudrais 1 seul résultat pour la Pomme car j'ai bcp de noms dans T1.

    C'est vraiment pas facile à expliquer, si vous ne comprenez pas, dites le

    Merci de votre aide
    Protégeons la couche d'eau jaune

  2. #2
    Membre du Club Avatar de Kokito
    Homme Profil pro
    Inscrit en
    Février 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2004
    Messages : 78
    Points : 56
    Points
    56
    Par défaut
    J'ai trouvé un explication plus simple, enfin je pense

    Voilà j'ai toujours mes 2 tables :
    Table T1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ID_T1 | Nom 
    ------|------ 
      1   | Pomme 
      2   | Poire
    Table T2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ID_T2 | T1 |   Debut    |    Fin 
    ------|----|------------|---------- 
      1   | 1  | 2005/01/10 | 2005/02/20 
      2   | 1  | 2005/02/23 | 2005/03/10 
      3   | 1  | 2005/03/13 | 2005/04/10
      4   | 2  | 2005/01/10 | 2005/02/24

    Voilà, je fais une requête toute banale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT     * FROM        T1 INNER JOIN
                          T2 ON T1.ID = T2.T1
    Résultat, ca me donne ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ID_T1 |  Nom  | ID_T2 | T1 |   Debut    |    Fin 
    ------|-------|-------|----|------------|---------- 
      1   | Pomme |   1   | 1  | 2005/01/10 | 2005/02/20 
      1   | Pomme |   2   | 1  | 2005/02/23 | 2005/03/10 
      1   | Pomme |   3   | 1  | 2005/03/13 | 2005/04/10
      2   | Poire |   4   | 2  | 2005/01/10 | 2005/02/24
    Je voudrais juste que ca me donne ca en fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ID_T1 |  Nom  | ID_T2 | T1 |   Debut    |    Fin 
    ------|-------|-------|----|------------|---------- 
      1   | Pomme |   3   | 1  | 2005/03/13 | 2005/04/10
      2   | Poire |   4   | 2  | 2005/01/10 | 2005/02/24
    Voilà, avec la date la plus récente dans le champ Debut !!!

    Je pense que c'est plus clair

    Merci de votre aide
    Protégeons la couche d'eau jaune

  3. #3
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT ID_T1, Nom, ID_T2,  T1, Debut,  Fin 
    FROM T1, T2 pT2
    WHERE pT2.T1 = ID_T1
    AND Debut = (SELECT Max(Debut)) FROM T2 sT2 WHERE sT2.T1 = pT2.T1)
    pT2 pour table T2 "principale"
    sT2 pour table T2 "secondaire"

    Si je peux me permettre, ton nom de champ T1 est assez mal choisi, tu aurais pu l'appeler T2_idT1 par exemple, pour éviter les confusions
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  4. #4
    Membre du Club Avatar de Kokito
    Homme Profil pro
    Inscrit en
    Février 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2004
    Messages : 78
    Points : 56
    Points
    56
    Par défaut
    Citation Envoyé par Xo
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT ID_T1, Nom, ID_T2,  T1, Debut,  Fin 
    FROM T1, T2 pT2
    WHERE pT2.T1 = ID_T1
    AND Debut = (SELECT Max(Debut)) FROM T2 sT2 WHERE sT2.T1 = pT2.T1)
    pT2 pour table T2 "principale"
    sT2 pour table T2 "secondaire"

    Si je peux me permettre, ton nom de champ T1 est assez mal choisi, tu aurais pu l'appeler T2_idT1 par exemple, pour éviter les confusions
    Merci beaucoup

    En fait, pour les noms de Table, c'était vraiment à titre d'exemples, j'ai des noms bien spécifique pour chaque table

    Je vais essayer de mettre ca dans ma requête de fou et si ca marche, je mets le Tag Résolu

    Merci Xo
    Protégeons la couche d'eau jaune

  5. #5
    Membre du Club Avatar de Kokito
    Homme Profil pro
    Inscrit en
    Février 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2004
    Messages : 78
    Points : 56
    Points
    56
    Par défaut
    Yeeees ca marche au poil !!!!!!!

    Voilà ce que me donne ma requête !!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT     MISSIONS.Num, MISSIONS.ID_MISSION, INTERIMAIRES.Nom, INTERIMAIRES.Prenom, PROLONGATIONS.Debut, PROLONGATIONS.Fin
    FROM         MISSIONS INNER JOIN
                          PROLONGATIONS ON MISSIONS.ID_MISSION = PROLONGATIONS.MISSION INNER JOIN
                          INTERIMAIRES ON MISSIONS.INTERIMAIRE = INTERIMAIRES.ID_INTERIMAIRE
    WHERE     (MISSIONS.SOCIETE = 10) AND (MISSIONS.INTERIMAIRE <> 0) AND (MISSIONS.MOTIF <> 0) AND (MISSIONS.Date_Reception = '' OR
                          MISSIONS.Date_Reception = ' ') AND (PROLONGATIONS.Debut =
                              (SELECT     MAX(PROLONGATIONS.Debut)
                                FROM          PROLONGATIONS
                                WHERE      PROLONGATIONS.MISSION = MISSIONS.ID_MISSION)) AND (CONVERT(varchar, DATEADD(d, 4, CONVERT(datetime, 
                          PROLONGATIONS.Debut, 121)), 111) <= CONVERT(varchar, GETDATE(), 111))
    Mille mercis, mille mercis, c'était bcp moins compliqué que je pensais mais j'étais parti sur une mauvaise piste

    Merci bcp Xo de m'avoir mis dans le droit chemin (et m'avoir donné la réponse )
    Protégeons la couche d'eau jaune

  6. #6
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    De rien

    Belle requête ...
    Moi, je n'ai jamais utilisé le mot-clé INNER dans mes requêtes, je ne sais même pas quel est son usage ... Vais aller faire un tour dans les tutos, tien !

    Edit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MISSIONS.Date_Reception = '' OR
    MISSIONS.Date_Reception = ' '
    Tu devrais peut-être utiliser la valeur NULL ?
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

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

Discussions similaires

  1. une requête multiple trop compliquée pour moi
    Par Invité dans le forum Requêtes
    Réponses: 1
    Dernier message: 24/08/2010, 22h38
  2. [MySQL] Trop compliqué pour moi
    Par nicolasferraris dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 06/02/2009, 15h35
  3. [Mail] mail trop compliqué pour moi
    Par tremeur53 dans le forum Langage
    Réponses: 4
    Dernier message: 29/10/2008, 15h05
  4. Requête SQL trop compliquée pour moi
    Par goldenboy68 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 10/04/2008, 14h50

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