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

MS SQL Server Discussion :

intervention seconde ligne


Sujet :

MS SQL Server

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2014
    Messages : 18
    Points : 17
    Points
    17
    Par défaut intervention seconde ligne
    Bonjour,

    Je souhaiterai afficher le résultat de la seconde ligne d'une requête. Je m'explique,

    J'ai deux colonnes:
    1ère colonne je souhaite afficher une intervention qui aura lieu prochainement. Exemple: Intervention1, 18/04/2014.
    2ème colonne, afficher l'intervention qui aura lieu après la première. Exemple: Intervention2, 19/04/1014.

    Lorsque la date de la première intervention (qui va être Intervention1), sera dépassée, la seconde intervention apparaîtra dans la première colonne à la place de Intervention1. Et une troisième intervention apparaîtrait à la place du second.

    Pour la première colonne c'est ok, mais je coince sur la deuxième avec cette requête.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT TOP 1 USER_ID, INTERV_DATE, INTERV_LIBELLE, INTERV_LIEU, INTERV_DESCRIPTION FROM TR_INTERVENTION 
                JOIN TR_LABO 
                ON TR_INTERVENTION.LAB_ID = TR_LABO.LAB_ID
                JOIN TR_USER
                ON TR_LABO.LAB_ID = TR_USER.USER_ID
                WHERE TR_LABO.LAB_ID = 1 AND INTERV_OBSELET=0 AND INTERV_DATE >= GETDATE() AND INTERV_ID=(INTERV_ID+1) order by INTERV_DATE;
    J'ai l'impression que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INTERV_ID=(INTERV_ID+1)
    ne donne aucune valeur, par exemple si faisait à la place , j'affiche bien la deuxième ligne d'intervention, j'affiche la troisième ligne d'intervention.

    Merci d'avance, si vous avez une idée !

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Effectivement, aucune ligne de la table dbo.TR_INTERVENTION n'a un identifiant qui est également à lui-même + 1.
    Il vous faut donc effectuer une auto-jointure, c'est à dire une jointure de dbo.TR_INTERVENTION à dbo.TR_INTERVENTION, dont le prédicat est INTERV_ID = INTERV_ID + 1.

    Reprenons d'abord votre code, que j'ai un peu formaté, mais surtout où j'ai aliasé le nom des tables :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    SELECT		TOP 1 U.USER_ID
    		, I.INTERV_DATE
    		, I.INTERV_LIBELLE
    		, I.INTERV_LIEU
    		, I.INTERV_DESCRIPTION
    FROM		dbo.TR_INTERVENTION AS I
    INNER JOIN	dbo.TR_LABO AS L
    			ON I.LAB_ID = L.LAB_ID
    INNER JOIN	dbo.TR_USER AS U
    			ON L.LAB_ID = U.USER_ID
    WHERE		L.LAB_ID = 1
    AND		I.INTERV_OBSELET = 0
    AND		I.INTERV_DATE >= GETDATE()
    AND		INTERV_ID = INTERV_ID + 1
    ORDER BY	I.INTERV_DATE;
    Votre future requête va ressembler à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    SELECT		TOP 1 U.USER_ID
    		, I1.INTERV_DATE AS date_1e_intervention
    		, I2.INTERV_DATE AS date_2e_intervention
    		, I1.INTERV_LIBELLE
    		, I1.INTERV_LIEU
    		, I1.INTERV_DESCRIPTION
    FROM		dbo.TR_INTERVENTION AS I1
    INNER JOIN	dbo.TR_INTERVENTION AS I2
    			ON I1.INTERV_ID = I2.INTERV_ID + 1
    			-- AND ?
    INNER JOIN	dbo.TR_LABO AS L
    			ON I1.LAB_ID = L.LAB_ID
    INNER JOIN	dbo.TR_USER AS U
    			ON L.LAB_ID = U.USER_ID
    WHERE		L.LAB_ID = 1
    AND		I1.INTERV_OBSELET = 0
    AND		I1.INTERV_DATE >= GETDATE()
    ORDER BY	I1.INTERV_DATE;
    J'ai mis un point d'interrogation dans le prédicat de jointure, car je pense que joindre sur un incrément de l'ID d'intervention est au mieux insuffisant, au pire incorrect.

    @++

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2014
    Messages : 18
    Points : 17
    Points
    17
    Par défaut Réponse intervention sql
    Bonjour,

    Merci de m'avoir répondu, j'ai trouvé une solution.

    Afficher la première intervention pas expirée, différente de la prochaine intervention. Voici le code,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT TOP 1 USER_ID, INTERV_DATE, INTERV_LIBELLE, INTERV_LIEU, INTERV_DESCRIPTION FROM TR_INTERVENTION 
              JOIN TR_LABO 
              ON TR_INTERVENTION.LAB_ID = TR_LABO.LAB_ID
              JOIN TR_USER
              ON TR_LABO.LAB_ID = TR_USER.USER_ID
              WHERE TR_LABO.LAB_ID = @USER_ID AND INTERV_OBSELET=0 AND                                                        
              TR_INTERVENTION.INTERV_ID <> (SELECT TOP 1 INTERV_ID FROM TR_INTERVENTION JOIN TR_LABO 
              ON TR_INTERVENTION.LAB_ID = TR_LABO.LAB_ID 
              WHERE TR_LABO.LAB_ID = @USER_ID AND TR_INTERVENTION.INTERV_OBSELET=0 AND INTERV_ID = INTERV_ID AND INTERV_DATE >= GETDATE() order by TR_INTERVENTION.INTERV_DATE) 
              AND INTERV_DATE >=GETDATE() order by INTERV_DATE;

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

Discussions similaires

  1. lire seconde ligne d'un fichier avec fgets
    Par key94 dans le forum C
    Réponses: 6
    Dernier message: 29/12/2010, 18h43
  2. Réponses: 6
    Dernier message: 08/08/2007, 17h41
  3. Réponses: 3
    Dernier message: 06/04/2007, 09h13
  4. Requête avec retour d'1 seule ligne de la seconde table
    Par Fred_76 dans le forum Requêtes
    Réponses: 16
    Dernier message: 09/11/2005, 13h46

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