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 :

Naviguer dans le lignes d'une table


Sujet :

MS SQL Server

  1. #1
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    316
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 316
    Points : 367
    Points
    367
    Par défaut Naviguer dans le lignes d'une table
    Bonjour à tous,

    je travaille sur sql server 2000, j'ai une table article ayant pour clé idarticle de type varchar (6), j'ai des lignes de ce type:

    A00001
    A00002
    B00001
    B00002
    B00003

    comment faire une requête afin de se positionner sur la dernière ligne, puis sur celle d'avant ou celle d'après ou la première ligne.
    je voudrais toujours avoir dans le recordset une seule ligne et non toutes les lignes de la table car j'ai 10 milles articles et je ne voudrais qu'afficher une à la fois.

    Merci

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Février 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 126
    Points : 143
    Points
    143
    Par défaut
    comment faire une requête afin de se positionner sur la dernière ligne, puis sur celle d'avant ou celle d'après ou la première ligne.
    Je te recommande tout d'abord la lecture de l'article suivant qui te permettra de comprendre que les données d'une base sont des ensembles et que par là même, on ne peut pas parler de "position" d'une ligne.

    Pour cibler une ligne en particulier tu dois utiliser par exemple une clause WHERE du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT mes_colonnes
    FROM mon_schema.article
    WHERE idarticle = 'B00002'

  3. #3
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    316
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 316
    Points : 367
    Points
    367
    Par défaut
    Merci Erwan de ta réponse, mais je ne connais pas le dernier article introduit, y a t'il une possibilité de faire un
    select top 1, idarticle from article order by idarticle desc
    pour aller à la dernière ligne et à partir de ça pourrais-je connaitre l'id de l'article précédent?

    Merci

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Février 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 126
    Points : 143
    Points
    143
    Par défaut
    y a t'il une possibilité de faire un select top 1, idarticle from article order by idarticle desc
    Rien ne t'empêche de faire cela en effet, même si l'instruction TOP n'est pas trop conseillée.

    Une autre solution, puisque dans ton cas, ta clé primaire semble indiquer l'ordre d'insertion dans la base, serait de faire quelque chose comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT mes_colonnes
    FROM mon_schema.article a
           INNER JOIN (SELECT MAX(idarticle) AS max_idarticle) filter ON a.idarticle = filter.max_idarticle

  5. #5
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    316
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 316
    Points : 367
    Points
    367
    Par défaut
    Merci encore erwan de ton aide, la requête fonctionne correctement juste une dernière chose comment connaitre maintenant juste la ligne avant de celle du max trouvé par la requête précédente?

    Merci

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Février 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 126
    Points : 143
    Points
    143
    Par défaut
    Pourquoi ne pas utiliser la fonction RANK ?

    En supposant que ta table ressemble à cela :

    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
    CREATE TABLE dbo.article 
    	(idarticle VARCHAR(6) NOT NULL,
    	descarticle VARCHAR(100) NOT NULL,
    	prixarticle DECIMAL(10,2) NOT NULL)
    GO
     
    ALTER TABLE dbo.article 
    	ADD CONSTRAINT pk_dbo_article PRIMARY KEY (idarticle)
     
    INSERT INTO dbo.article 
    (idarticle, descarticle, prixarticle)
    SELECT 'A00001','Article #1',15.36
    UNION SELECT 'A00002','Article #2',8.24
    UNION SELECT 'B00001','Article #3',9.16
    UNION SELECT 'B00002','Article #4',151.12
    UNION SELECT 'B00003','Article #5',23.96
    Récupérer l'avant dernier élement (basé sur idarticle) cela donnerait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT art.idarticle, art.descarticle, art.prixarticle
    FROM dbo.article art
    	INNER JOIN (SELECT art.idarticle, RANK() OVER (PARTITION BY NULL order by art.idarticle DESC) AS RANK
    				FROM dbo.article art) filter ON art.idarticle = filter.idarticle
    WHERE filter.rank = 2
    Dans la clause WHERE, le predicat indique la "position d'insertion" c'est à dire 1 pour le dernier inséré, 2 pour l'avant dernier... etc

  7. #7
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Bonsoir,

    Quel est la finalité de votre question ?

    Comment allez vous utiliser votre recordset ? Pouvez vous nous en dire plus ?

    ++

  8. #8
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    316
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 316
    Points : 367
    Points
    367
    Par défaut
    Bonjour a tous,

    Encore une fois Merci Erwan c'est bien ta requête mais j'utilise sql server 2000.
    concernant la question de mikedavem, dans une form je fois afficher les articles, j'ai quatre boutons premier, précédent, suivant, dernier.
    je dois tous d'abord me positionner sur le dernier, et si l'utilisateur clique sur suivant ou précédent je me positionne sur la ligne suivante ou précédente.
    je fais un select * from ma table et je crée un curseur que je peux le gérer avec le langage de programmation qui à des instructions qui permettent de naviguer entres les lignes du recordset.
    mais dans des cas avec beaucoup de lignes avec le select * from .... je dois attendre au moins cinq seconde pour que la form(masque) s'affiche.
    c'est pour cette raison que je voulais une requête qui sélectionne une seule ligne tous en commençant par le dernier.
    Merci

  9. #9
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Et vous ne pouvez pas limiter votre jeu de résultat retourné en utilisant une restriction et en évitant le SELECT * FROM .... ?

    De cette manière :
    - vous limitez à la fois le volume de données sur le réseau
    - vous ne déclenchez pas à chaque fois une transaction pour alimenter votre recordset lorsque vous voulez voir les autres enregistrements de votre table.

    Quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT col1,col2,col3
    FROM dbo.maTable
    WHERE <predicat>
    ++

  10. #10
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    316
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 316
    Points : 367
    Points
    367
    Par défaut
    Bonjour,

    Merci Mikedavem de ta réponse mais comment limiter les lignes? je ne connais pas les codes articles, ce que je voudrais c'est tous d'abord me positionner sur le dernier article créer pour afficher la dernière ligne saisie et ensuite de se déplacer à la ligne suivante ou précédente (je voudrais limiter si possible le recordset à une ligne) s'il existe une autre solution tant mieux.

    Merci

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Février 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 126
    Points : 143
    Points
    143
    Par défaut
    Bonjour,

    A votre place, je commencerais par revoir la conception de votre application. Vous nous disiez :

    car j'ai 10 milles articles et je ne voudrais qu'afficher une à la fois.
    Si vous estimez que rapatrier toutes ces lignes dans un dataset est trop couteux (ce qui se comprend !), on imagine de la même façon mal un utilisateur cliquer 9.999 fois sur votre contrôle pour passer de du 1er au dernier article.

    Segmentez l'ensemble de vos articles (par catégories, date de saisie... que sais-je) et déduisez en les clause WHERE en fonction des critères retenus par l'utilisateur.

    Vos utilisateur seront il amené à demander à l'application : "je veux le 6.759ème article ?"

  12. #12
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    316
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 316
    Points : 367
    Points
    367
    Par défaut
    Bonjour,

    pour la recherche j'ai un masque qui permet de faire une recherche selon les critères (code, libellé...).
    donc d'après ce que j'ai compris au début j'affiche un masque qui permet de faire une recherche selon les critères introduits et le recordset sera remplis selon le résultat de la requête?

    Merci

  13. #13
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Je rejoins les propos d'Erwan1978.
    Il faut se poser la question de comment vos utilisateurs vont chercher vos articles. Je ne pense pas que la meilleure façon de faire est de proposer l'article le plus récent et de remonter au fur et à mesure sur d'autres articles. A vous de définir les critères les plus pertinents !!

    Si vous avez effectivement un masque vous pouvez donc l'inclure dans la restriction de votre requête. Votre recordset sera donc rempli par les données relatifs à votre requête + restriction

    ++

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Février 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 126
    Points : 143
    Points
    143
    Par défaut
    donc d'après ce que j'ai compris au début j'affiche un masque qui permet de faire une recherche selon les critères introduits et le recordset sera remplis selon le résultat de la requête?
    Exactement ! Dans le scenario où votre utilisateur sélectionne "velo" et vert par exemple; vous devez construire une instruction SQL en conséquence, du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT mes_colonnes
    FROM mes_articles
    WHERE categorie = 'velo'
       AND couleur = 'vert'
    ORDER BY identifiant_article
    Pour un exemple plus précis, vous devez publiez la structure de votre/vos table(s).

    Ceci dit, il n'est pas dit que cela soit la meilleure méthode ; en effet, selon votre langage de programmation, vous pouvez filtrer votre dataset a posteriori (je pense à .Net, mais je suppose que cela doit être faisable dans d'autres langages).

Discussions similaires

  1. comment chopper le nb de lignes d'une table dans un script python?
    Par Mydriaze dans le forum Général Python
    Réponses: 9
    Dernier message: 21/12/2007, 14h16
  2. Réponses: 5
    Dernier message: 06/11/2007, 13h58
  3. ligne d'une table dans colonne d'un select
    Par Invité dans le forum Langage SQL
    Réponses: 5
    Dernier message: 13/09/2007, 11h49
  4. Réponses: 3
    Dernier message: 15/06/2007, 22h50
  5. Réponses: 2
    Dernier message: 15/09/2006, 12h18

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