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 :

Ma requête est elle possible ?


Sujet :

Langage SQL

  1. #1
    Invité
    Invité(e)
    Par défaut Ma requête est elle possible ?
    Bonjour

    J ai une table avec une colonne id et une colonne valeur

    Actuellement je boucle sur tous mes id et cherche celui ou Valeur (id-1)=X et valeur(id-2)=Y par exemple.
    Cela prend énormément de temps d autant que j ai plus de 200000 lignes.

    Est il possible de faire cela en une seule requête, c est à dire sans connaitre l id ?

    Merci de vos conseils ?

  2. #2
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 193
    Points : 28 077
    Points
    28 077
    Par défaut
    quelque chose du genre
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT id FROM Table T0
    WHERE
    EXISTS( SELECT id FROM Table T1 WHERE T1.id=T0.id-1 AND T1.Valeur=X)
    AND
    EXISTS( SELECT id FROM Table T2 WHERE T2.id=T0.id-2 AND T2.Valeur=Y)
    Pas sur que ce soit rapide, mais c'est en une seule requete

    Sinon la version avec jointure, mais ça doit être kif-kif
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT id 
    FROM Table T0
    INNER JOIN Table T1 ON T1.id=T0.id-1 AND T1.Valeur=X
    INNER JOIN Table T2 ON T2.id=T0.id-2 AND T2.Valeur=Y
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci d avoir pris le temps de t intéresser à mon pb.

    Je testerai ça dés demain

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 134
    Points : 38 558
    Points
    38 558
    Billets dans le blog
    9
    Par défaut
    Attention : si la colonne id est attribuée par le SGBD ("identity column") alors il est fort possible que id-1 et/ou id-2 n'existent pas !
    Que cherchez vous à faire fonctionnellement ? il y a probablement d'autres méthodes que l'utilisation d'id, toujours très dangereuse

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonsoir

    J ai testé les requêtes précédentes et elles tournent en boucle sans fin...

    L id est en auto incrément et je le remplis avec NULL.

    Je cherche très concrètement par exemple à récuperer par exemple l'id 100 si la valeur pour un id=100 est de 3, la valeur pour un id=99 est de 3 et si la valeur pour un id=98 est de 2.
    merci pour votre aide

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 134
    Points : 38 558
    Points
    38 558
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par rooky06 Voir le message
    L id est en auto incrément et je le remplis avec NULL.
    Donc je confirme : oubliez la recherche de valeurs d'id contigües
    - il peut y avoir des trous dans les valeur d'id
    - rien ne garantit que l'id de valeur 100 a été créé après l'id de valeur 99

    Citation Envoyé par rooky06 Voir le message
    Je cherche très concrètement par exemple à récuperer par exemple l'id 100 si la valeur pour un id=100 est de 3, la valeur pour un id=99 est de 3 et si la valeur pour un id=98 est de 2.
    merci pour votre aide
    Je n'ai rien compris
    Là vous décrivez le comment, il faut décrire le quoi : quel est le but recherché ?
    Par exemple : je veux obtenir la liste chronologique des valeurs ou encore, je veux connaitre tous les identifiants qui correspondent à la valeur "3"

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 571
    Points
    52 571
    Billets dans le blog
    5
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT T0.*
    FROM   MaTable AS T0
           JOIN MaTable AS T1 ON T0.id = T1.id + 1 AND T0.valeur = T1.valeur 
           JOIN MaTable AS T2 ON T0.id = T1.id + 2 AND T0.valeur = T2.valeur + 1
    Assurez vous d'avoir au moins un index sur (id, valeur).

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  8. #8
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    bonjour,

    vous pouvez aussi faire comme ceci (à adapter à votre cas concret, ça répond juste au problème tel qu'il est posé)

    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
     
    WITH tmp AS (
        SELECT  
    		  id 
    	   ,   valeur
    	   ,   LAG(id, 1)	    over(order by id) as id1    
    	   ,   LAG(valeur, 1)  over(order by id) as valeur1
    	   ,   LAG(id, 2)	    over(order by id) as id2    
    	   ,   LAG(valeur, 2)  over(order by id) as valeur2
        FROM latable
    )
    SELECT id
    FROM tmp
    WHERE   valeur = 3
    AND	   id1 = id - 1
    AND	   valeur1 = 3
    AND	   id2 = id - 2
    AND	   valeur2 = 2

Discussions similaires

  1. [Toutes versions] Une requête est-elle possible ?
    Par florianne dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 07/04/2017, 21h51
  2. Cette requête est-elle possible ?
    Par cherche_encore dans le forum Langage SQL
    Réponses: 4
    Dernier message: 14/08/2013, 09h55
  3. Cette requête sur deux tables est-elle possible ?
    Par Alain.g dans le forum Requêtes
    Réponses: 2
    Dernier message: 04/04/2012, 03h31
  4. Ma requête est elle possible?
    Par un_passant dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/02/2012, 10h24
  5. cette requête est-elle possible ?
    Par night_flyers dans le forum Requêtes
    Réponses: 2
    Dernier message: 11/07/2009, 13h12

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