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

Sybase Discussion :

Requete requête sous sybase


Sujet :

Sybase

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Requete requête sous sybase
    Bonjour,

    J'ai un petit problème de sous requète sous Sybase
    Je sais que l'on peux appliquer après un FROM une sous requête en SQL du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select A.valeur,A.count 
    from (select nom,count(*) as "count" from table group by nom) A
    where A.count<10
    où la table est remplacée par une sous requète.
    Je n'arrive pas à appliquer cette méthode à une requète Sybase, et ca m'arrangerai bien

    Sachant que les views ne m'interrèssent pas ...

    Merci d'avance

  2. #2
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 224
    Points : 19 566
    Points
    19 566
    Billets dans le blog
    25
    Par défaut
    Sous Sybase, les sous-requêtes marchent, mais elles ne sont pas à mettre n'importe où, comme par exemple dans ton exemple.

    Par contre, il est souvent plus judicieux de passer pour une jointure simple, ce qui est plus optimal dans la plupart des cas.

    Pour ton exemple, si tu veux n'afficher que les noms apparaissant plus de 10 fois, tu doix utiliser un having si tu pose une condition sur le résultat d'un agrégat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select Nom, count(*) 
    from maTable 
    group by Nom 
    having count(*) > 10
    Par contre, tu peux faire des sous-requêtes de type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select nom, age 
    from maTable 
    where age in (select max(age) from mesClient)
    ... mais c'est beaucoup + futé d'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select nom , max(mesClients.age)
    from maTable, mesClients
    where maTable.age = mesClients.Age
    Sr DBA Oracle / MS-SQL / MySQL / Postgresql / SAP-Sybase / Informix / DB2

    N'oublie pas de consulter mes articles, mon blog, les cours et les FAQ SGBD

    Attention : pas de réponse technique par MP : pensez aux autres, passez par les forums !

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 23
    Points : 26
    Points
    26
    Par défaut
    PAs trop d'accord dans le sens ou où du SQL ne s'optimise pas, ce sont l'utilisation judicieuse des index ou cluster qui vont permettre uen bonne performance.
    Donc tu peux tout à fait Générer dans ta clause Where un filtre de sous requête, mais n'oublis pas que si tu à toujours un risque de générer un produit cartésien dans ta sous-requête.
    A toi de connaitre précisement ton MCD.
    Je te conseillerai d'utiliser le Sp_helpindex pour déterminer les index disponible, de modéliser tes jeux de requetes qui devrait créer tes tables en clause WHERE dans ta requête finale.
    En effet je doute que cette question provienne de la simple méconnaissance des agrégats.
    Quoiqu'il arrive, je te conseille avant toute chose de mettre dans ton script avant l'éxecution un :
    set noexec on
    go
    set showplan on
    go
    PS : table scan en resultat, c mauvais signe.
    Positioning by key, c mieux
    Using clustered index, c good.
    JE te joins un exemple concret de requete sybase avec une sous requete :

    select convert(char(12),C.adtvl,103),";",
    convert(char(6),B.azcogl1),";",
    "EUR",";",
    str(C.amtvlnr,10,3),";",
    str(C.amtactr,10,3)
    from ADMIN..aprt A,ADMIN..aptx B(index aptx_c),ADMIN..ahvl C(index ahvl_nc2)
    where C.aidprt=A.aidprt
    and B.aidptx=A.aidprt
    and B.azcogl1 like "508%"
    and C.adtvl between (select all max(C.adtvl) from ADMIN..ahvl C where C.aidprt="
    5000001") and getdate()

    J'espére que cet exemple concret t'apportera une vraie réponse.
    3 tables sur 1 base sont exploitées.
    La contrainte majeure est que l'élément de tri n'est pas un index ou un élément de clef.
    Cependant, un des éléments de requête est une partie de clef décomposée.
    Malheureusement, un tri doit être opéré dessus.
    Heureusement, elle dispose d'un index qui est lui déclarable.
    Et là, ma requête, qui peut être écrite plus simplement est réellement opérationnelle puisqu'elle génére mon résultat en un minimum de temps de traitement.



    EOF

  4. #4
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 224
    Points : 19 566
    Points
    19 566
    Billets dans le blog
    25
    Par défaut
    Citation Envoyé par Zeo_BO
    PAs trop d'accord dans le sens ou où du SQL ne s'optimise pas, ce sont l'utilisation judicieuse des index ou cluster qui vont permettre uen bonne performance.
    Si, la façon d'écrire le code s'optimise !

    Exemple ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select ID, Valeur 
    from Comptes
    where Valeur * 1.2 < 100
    va générer un Table Scan sur la table Comptes, même si un index existe sur Valeur.

    par contre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select ID, Valeur 
    from Comptes
    where Valeur < 100/1.2
    pourra utiliser la SARG, et donc l'index sur Valeur

    CQFD

    Citation Envoyé par Zeo_BO
    set noexec on
    go
    set showplan on
    go
    Il vaut mieux exécuter ces 2 sets dans l'ordre inverse : le noexec on risque de rendre inopérant le showplan

    Se plus, si tu veux obtenir encore plus d'info de l'optimiseur, tu peux exécuter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dbcc traceon(3604)
    dbcc traceon(302)
    dbcc traceon(310)
    ... mais là, ça devient alors très, très verbeux...
    Sr DBA Oracle / MS-SQL / MySQL / Postgresql / SAP-Sybase / Informix / DB2

    N'oublie pas de consulter mes articles, mon blog, les cours et les FAQ SGBD

    Attention : pas de réponse technique par MP : pensez aux autres, passez par les forums !

Discussions similaires

  1. Tracer les requêtes Sous SYbase ASE 12.5.4
    Par vegeta7895 dans le forum Sybase
    Réponses: 0
    Dernier message: 11/12/2009, 14h55
  2. log des requêtes sous sybase 10
    Par VsMetal dans le forum Sybase
    Réponses: 3
    Dernier message: 03/05/2004, 14h09
  3. formatage des requêtes sous psql
    Par Bouboubou dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 03/02/2004, 11h10
  4. Syntaxe PARAMETERS pour requête sous VBA
    Par GAGNON dans le forum VBA Access
    Réponses: 3
    Dernier message: 28/11/2003, 11h39
  5. Les index sous Sybase
    Par Emdis dans le forum Autres SGBD
    Réponses: 2
    Dernier message: 02/06/2003, 15h21

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