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

Requêtes et SQL. Discussion :

SELECT sur plages non contigues [AC-2003]


Sujet :

Requêtes et SQL.

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2015
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2015
    Messages : 39
    Points : 29
    Points
    29
    Par défaut SELECT sur plages non contigues
    Bonjour

    J'ai une base de données comme celle-ci, dans laquelle je dois sélectionner les plages en vert (à partir de la lettre b jusqu'à la fin du texte)

    Nom : plage.JPG
Affichages : 132
Taille : 39,8 Ko

    Je fais cette requete qui me renvoie une erreur: "cette sous-requête peut renvoyer au plus un enregistrement"
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM test
    WHERE ID > (SELECT ID FROM test WHERE Lettre Like "*b*") AND  ID < (SELECT ID FROM test WHERE numEnonce < (SELECT numEnonce FROM test WHERE ID < ID - 1));

    Je suppose que le problème vient du fait que la requête renvoie plusieurs lignes qui contiennent b et que les plages à sélectionner se chevauchent

    Donc je refais cette requete avec TOP 1 en plus qui me renvoie une ligne vide:

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM test
    WHERE ID > (SELECT  TOP 1 ID FROM test WHERE Lettre Like "*b*") AND  ID < (SELECT ID FROM test WHERE numEnonce < (SELECT numEnonce FROM test WHERE ID < ID - 1));


    Cette même requête marche si je fais (mais je n'ai que le premier bloc sans la première ligne, ce qui est acceptable pour l'instant):
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM test
    WHERE ID > (SELECT TOP 1 ID FROM test WHERE Lettre Like "*b*") AND  ID < 6;

    Est-il possible de faire une sélection de plages non contigues en SQL ou faut-il utiliser une macro et de la récursivité?

    merci d'avance

  2. #2
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 612
    Points : 56 717
    Points
    56 717
    Billets dans le blog
    40
    Par défaut
    Bonjour,

    Ne faudrait-il pas faire intervenir le champ Texte ?

    À commencer par rechercher le plus petit ID, pour chaque Texte, où le champ Lettre comporte un 'b' ?

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT Texte, Min(ID) AS MinDeID
    FROM test
    WHERE Lettre Like "*b*"
    GROUP BY Texte;

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2015
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2015
    Messages : 39
    Points : 29
    Points
    29
    Par défaut
    En effet si je fais ce code, j'ai bien les ID de début de la plage ( 3, 7, 12) et si je fais
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Texte, Max(ID) AS MaxDeID
    FROM test
    GROUP BY Texte;
    j'ai bien les ID de fin de plage ( 5, 10, 14)
    Mais si j'imbrique les 2
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM test
    WHERE ID > (SELECT Texte, Min(ID) AS MinDeID FROM test WHERE Lettre Like  "*b*"GROUP BY Texte) AND ID < (SELECT Texte, Max(ID) AS MaxDeID FROM test GROUP BY Texte)   ;
    j'ai un message d'erreur, pour la même raison que plus haut je suppose: on ne peut pas trouver les enregistrements entre les plages 3,7,12 et les plages 5, 10, 14, il faut faire 3-5, 7-10 etc

  4. #4
    Membre expert
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2012
    Messages
    1 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 1 869
    Points : 3 448
    Points
    3 448
    Par défaut
    Bonjour jeanduri, f-leb,

    C'est juste que vous ne faisiez pas le lien avec le champ Texte. Comme le calcul se fait sur la même table il faut lui donner un alias et le SQL devrait ressembler à ceci, à vérifier :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT Result.ID, Result.Texte, Result.numEnonce, Result.Lettre
    FROM test AS Result
    WHERE Result.ID>=(SELECT  Min(test.ID) AS MinDeID
    FROM test
    WHERE test.Texte=Result.Texte AND test.Lettre="b"
    GROUP BY test.Texte;);

    Bonne journée
    Ce qui se conçoit bien s’énonce clairement et les mots pour le dire arrivent aisément. Nicolas Boileau
    Si tout est OK, n'oubliez pas de cliquer sur

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2015
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2015
    Messages : 39
    Points : 29
    Points
    29
    Par défaut
    Grand merci ca marche parfaitement
    Par contre, c'est très très lent: environ 30 min pour une DB qui fait environ 50.000 lignes

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

Discussions similaires

  1. [XL-2010] Fonction moyenne.si.ens sur plages non contigues
    Par Pounchmama dans le forum Excel
    Réponses: 2
    Dernier message: 11/03/2016, 14h03
  2. Réponses: 3
    Dernier message: 11/01/2015, 18h17
  3. [XL-2007] Actions sur plages / cellules non contigues définies à partir d'une ligne active
    Par Barbenault dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 06/10/2014, 11h33
  4. [XL-2003] Sélection plage non contigues
    Par stargates dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/11/2009, 06h39
  5. Selection de lignes non contigues
    Par dj-julio dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 23/11/2007, 15h47

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