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 :

Arret Commande SQL dès un élément trouvé


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 106
    Points : 59
    Points
    59
    Par défaut Arret Commande SQL dès un élément trouvé
    Bonjour,

    Je lance une commande SQL dont le résultat peut être assez long a s'afficher.
    Or, je me sers de cette commande uniquement pour vérifier l'existence d'au moins un élément. Actuellement, je fais un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Select count (ID) from matable where ......
    avec pas mal de jointure a la suite
    Je me fous qu'il y ai un, deux ... ou 10 millions enregitrments retournés

    Existe t-il en SQL des mots clés ... permettant de stopper le recherche dès le premier élément trouvé ?

    Merci

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 099
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 099
    Points : 28 400
    Points
    28 400
    Par défaut
    SQL est un langage de traitement ensembliste de données.
    Le SGBD recherchera donc toutes les données correspondant au filtre de la requête.
    D'autant plus avec COUNT : la valeur retournée est le nombre d'enregistrements trouvés.
    Comment retourner ce nombre si la recherche n'est pas terminée ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 106
    Points : 59
    Points
    59
    Par défaut
    Merci pour votre réponse

    Je met count, ainsi il me renvoie une seul ligne
    j'aurais très bien utilisé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ID FROM matable WHERE ......
    et tester la fin de fichier derrière.

    en fait, je cherche un equivalent a LIMIT du mysql

    cordialement

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 099
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 099
    Points : 28 400
    Points
    28 400
    Par défaut
    Si ton SGBD (que tu n'as pas précisé : Règles du forum Langage SQL à lire par tous) comporte un optimiseur extrêmement efficace, il tirera peut-être parti de cette construction, qui retournera 0 ou 1 ligne suivant que le critère est vérifié ou non :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT 1
    FROM DUMMY
    WHERE EXISTS
     ( SELECT 1
       FROM matable
       WHERE condition
     );

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 106
    Points : 59
    Points
    59
    Par défaut
    1000 excuses, c'est vrai, j'utilises firebird 1.5

    Apparament, votre méthode est inefficace sous firbird, c'est dommage. En cherchant un peu j'ai croisé des mots clés, comme FIRST, tel que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select FIRST Monchamp from Matable
    Mais ce mot clé est inconnu

    Cordialement

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 099
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 099
    Points : 28 400
    Points
    28 400
    Par défaut
    Des clauses de limitation des résultats, telles que FIRST, TOP ou LIMIT, s'appuient sur un ensemble de lignes ordonné.
    Et pour pouvoir ordonner les lignes résultant d'une requête... il faut les avoir toutes récupérées. En effet, comment prédire que la dernière ligne trouvée correspondant au filtre ne sera pas la première une fois appliquée la clause ORDER BY ?

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 106
    Points : 59
    Points
    59
    Par défaut
    Exact, j'étais justement en train de m'en rendre compte !

  8. #8
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 099
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 099
    Points : 28 400
    Points
    28 400
    Par défaut
    C'est peut-être la partie condition de la requête qui est à optimiser...
    Penser aussi au niveau physique : index, statistiques...

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 106
    Points : 59
    Points
    59
    Par défaut
    En fait, c'est plutot les jointures sur de grosses tables (sur lesquelles je fait des sélections) qui ralentisse la requête.

    Mais bon, je vais chercher.

    Merci

  10. #10
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 849
    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 849
    Points : 52 975
    Points
    52 975
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT 1 -- ou tout autre chose
    WHERE  EXIST(SELECT *
                 FROM   --> la suite étant votre requête originale
                )
    Si votre SGBDR est Oracle, rectifiez comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT 1 -- ou tout autre chose
    FROM   DUAL
    WHERE  EXIST(SELECT *
                 FROM   --> la suite étant votre requête originale
                )
    Si votre SGBDR ne supporte pas de requête select sans la clause FROM alors ajoutez une table quelconque d'une seule ligne, par exemple ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CREATE TABLE T1 (C INT);
    INSERT INTO T1 VALUES (1);
    Et rectifiez votre requête comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT 1 -- ou tout autre chose
    FROM   T1
    WHERE  EXIST(SELECT *
                 FROM   --> la suite étant votre requête originale
                )
    A +

  11. #11
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    et un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT FIRST 1 * FROM .......
    ne fonctionne pas non plus ??

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 106
    Points : 59
    Points
    59
    Par défaut
    Merci pour vos réponse.

    Concernat le select 1 ... where exists ..., firebird attend toujours la fin de la requête de recherche, je ne comprend pas pourquoi et je cherche...

    Le Select first 1 est obligé de lire l'ensemble des réponses pour envoyer effectivement le premier et ce, malgré l'absence de clause ORDER BY

    Si je ne trouve pas, je découperai ma commande SQL en plusieurs 'morceau' : pour un eneg donné de ma table, j'irai chercher si des enreg corresponde et dès que j'en trouve un, j'arrête.

    Statistiquement, par rapport aux élements de ma BDD, en lisant par ordre chronologique, ce sera en général plus rapide.

  13. #13
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 741
    Points
    11 741
    Par défaut
    Citation Envoyé par obione Voir le message
    Si je ne trouve pas, je découperai ma commande SQL en plusieurs 'morceau' : pour un eneg donné de ma table, j'irai chercher si des enreg corresponde et dès que j'en trouve un, j'arrête.

    Statistiquement, par rapport aux élements de ma BDD, en lisant par ordre chronologique, ce sera en général plus rapide.
    Non. Comme l'a souligné Alain, les SGBD ont un fonctionnement ensembliste et non procédural. C'est-à-dire qu'ils sont optimisés pour traiter des données en masse et non ligne à ligne. Autrement dit, lire les ligne une par une revient à prendre l'autoroute en restant bloqué en première vitesse... on finit par arriver au bout (généralement), mais ce n'est pas la méthode la plus rapide .

    Pour accélérer ta requête, je suggèrerais de poser un petit index sur la ou les colonnes du WHERE.

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 106
    Points : 59
    Points
    59
    Par défaut
    Ce que je voulais dire, c'est que je vais lire un enreg de ma table principal,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select id from matable where monchamp=4
    sans jointure, avec des sélections minimale et, par une autre requête,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select blabla from uneautre table join etc ..... where champclétrangere=%d
    , vérifier si des enreg existent sur les autres tables jointes.

Discussions similaires

  1. commande sql et élément Session
    Par makin_toch dans le forum ASP.NET
    Réponses: 10
    Dernier message: 31/05/2011, 18h21
  2. Commande SQL / connaître taille d'1 base
    Par Thomad dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 26/04/2005, 11h38
  3. [JDBC] Commande SQL récalcitrante
    Par Dahu dans le forum JDBC
    Réponses: 7
    Dernier message: 05/04/2005, 16h03
  4. commande SQL truncate table xxx
    Par Yogy dans le forum SQL
    Réponses: 1
    Dernier message: 07/10/2004, 14h57
  5. [dBase]il y a mieux que la commande sql UPDATE ?
    Par sana72 dans le forum Autres SGBD
    Réponses: 4
    Dernier message: 12/12/2002, 11h59

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