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

ASP.NET Discussion :

Requête SQL imbriquées


Sujet :

ASP.NET

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 10
    Points : 4
    Points
    4
    Par défaut Requête SQL imbriquées
    Bonjour,

    Je me lance sur un forum pour la première fois, j'ai toujours trouvé les réponses à mes questions dans les forums (merci à tous ceux qui les ont posées et surtout tous ceux qui y ont répondu ;-))

    Mais la j'avoue que depuis plusieurs mois de recherche je trouve aucune solution à mon problème.

    Je souhaite me connecter à une partie de ma base de données pour faire des requêtes SQL (SQL server 2005) trés complexes les une derrières les autres que je récupére dans un dataset.
    J'ai pour le moment lancé les requêtes sur une connexion à l'ensemble de ma BD (la BD comporte 3 tables de plus de 500 000 lignes)
    Certaines étant trop complexes n'arrivent pas a être finalisées (time out)
    Pour que les requêtes les plus complexes puissent être exécutées il faudrait que je puisse les faire sur une partie de la BD sélectionné sur id d'une autre table.
    Ex :
    SELECT *
    FROM table1 INNER JOIN
    table2 ON table1.idTable1 = table2.idTable1 INNER JOIN
    table3 ON table2.idTable2 = table3.idTable3 INNER JOIN
    table4 ON table2.idtable2 = talbe4.idtalbe2
    WHERE table1.idTable1 = @id

    Cette requête récupèrerait les données dont j'ai besoin et m'éviterait de faire une interrogation sur toute la BD.

    J'ai pensé faire mes requêtes dans un dataset typé avec des relations entre chaque datatable, mais le dataset ne sais pas faire de requete sur plusieurs table et surtout des requêtes complexes.
    Je ne peux en aucun cas faire les requêtes par programmation.
    Avez vous une idée pour faire ceci ?

    D'avance merci

  2. #2
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Points : 8 734
    Points
    8 734
    Par défaut
    Bah tu mets le résultat de ta requête dans un DataSet.
    Où est le problème?

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Je ne peux pas faire de requete SQL dans une dataset.
    Par exemple pour exécuter une requête trés complexe qui contient un select dans un select en interrogeant plusieurs tables ?
    le dataset ne sait faire que des requêtes select sur une seul table (pas de for ni de jointure)
    Mes requetes que j'éxécute se trouve dans une base de données, je ne peux donc pas les faires en VB en interrogeant le Dataset.

    Si c'était possible de faire du SQL dans un dataset, j'aurais la solution à mon problème ....

    La requête que j'ai mis dans mon message est pour la récupération des données à interroger.

    Les requêtes doivent ensuite s'éxécuter sur l'ensemble du résultat retourné dans la requête qui se trouve dans le message.

    J'espère avoir été plus claire ?!?

    As tu une autre idée ?

  4. #4
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2006
    Messages
    400
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 400
    Points : 459
    Points
    459
    Par défaut
    Bonjour,

    Un Dataset ne fait pas de MultiTable ?
    Et pourtant si :
    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
     
    ...
    dim srequete as string=""
    srequete as string="SELECT *"
    srequete as string="FROM table1 INNER JOIN"
    srequete as string="table2 ON table1.idTable1 = table2.idTable1 INNER JOIN"
    srequete as string="table3 ON table2.idTable2 = table3.idTable3 INNER JOIN"
    srequete as string="table4 ON table2.idtable2 = talbe4.idtalbe2"
    srequete as string="WHERE table1.idTable1 = @id"
     
    Dim oAdapter as new data.sqlclient.sqlDataAdapter(srequete,"chaine de connexion")
     
    dim oDataset as new data.dataset
    oAdapter.fill(oDataset )
    ...
    Ton Dataset contient plusieurs tables liées par la propriété ChildRelation.

    A bientôt

  5. #5
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut
    Euh, pourrais me permettre de dire que c'est, à mon humble avis, une fausse route ?

    Tel que je vois l'énoncé du problème et et reste à vérifier que j'ai tout compris dans le bon ordre, je pense que le souci se trouve plutôt vers le serveur SQL que dans le code VB.

    J'ai noté un mot qui me fait toujours peur : TimeOut.

    Je ne pense pas que le DataSet soit plus rapide que le serveur SQL pour requêter. D'abords il faudrait peut être vérifier que le serveur SQL en direct est capable d'éxécuter la requête dans le temps imparti. Ensuite, il faut peut être envisager une petite optimisation des dites requêtes.

    Ensuite, donnes également ton contexte de sortie : une fois ta requête exécutée, t'en fait quoi des données ? De ce côté là aussi il y a peut être un moyen plus efficace de traiter les choses. Par exemple, si tu souhaite afficher les données retounées dans un GridView, un bon paramettrage te permet de charger les page de données les unes aprés les autres, donc tu ne remonte que peu de données à chaque fois.

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Aie aie aie,

    je pense que j'ai du mal m'exprimer :
    Mes requetes sont optimisées au max, elles sont vraiement trés trés complexes, c'est pour ca qu'il faut que je les exécute seulement sur une partie de ma base de données (Ma BD va augmenter de jour en jour et je dois sélectionner les données que j'interroge (plus de 500 000 ligne par table) la requete que j'ai mis en exemple qui me servirait pour sélectionner les données a exploiter avec mes requêtes complexes, n'aurait plus que 10 000 lignes à 50 000 lignes par table et la les requêts n'auraient plus de TimeOut).

    Je n'ai aucun problème d'affichage puisque ma classe n'affiche pas mais récupère seulement le résultat dans un dataset.

    Sur 100 requêtes lancées il y en a seulement une ou deux qui plante avec un timeOut.

    Si je pouvais lancer les requêtes qui plante sur le dataset que tu me donnes en exemple ca serait super hyper géniale, mais malheureusement je ne peux pas puisque comme dit précédemment je ne peux pas exploiter ou exécuter du code VB à la place des requêtes complexes ...

  7. #7
    Expert éminent sénior

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Points : 12 465
    Points
    12 465
    Par défaut
    ... malheureusement je ne peux pas puisque comme dit précédemment je ne peux pas exploiter ou exécuter du code VB à la place des requêtes complexes ...
    Heu...

    comment est-ce que tu comptes recuperer les donnees depuis ta db ?

    Parce que le code de mafyoso me semble quand meme super standard...

    A cote de ca, tu peux peut-etre, si la requete est un pb, la passer en procedure stockee....mais bon, si tu peux pas l'appeler, aussi

  8. #8
    Inscrit

    Profil pro
    Inscrit en
    Février 2004
    Messages
    862
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2004
    Messages : 862
    Points : 1 229
    Points
    1 229
    Par défaut
    Citation Envoyé par Fanette85 Voir le message
    Mes requetes sont optimisées au max
    Tu nous excuseras d'en douter, mais tes questions ne font pas précisemment penser à un développeur avec 10 ans d'expérience ou a un DBA Senior...

    Hormis la problématique de l'accès au données en .Net que tu ne sembles pas maîtriser à 100%, peut être y a-t-il aussi un petit travail à faire sur les requêtes en elles-mêmes.

    Tu ne voudrais pas nous donner le code réèl ?

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    C'est justement mon problème, comment récupérer qu'une partie de ma BD.
    Une connexion seulement sur une partie de la BD soit dans une base de données temporaire, soit en XML soit ....

    Pour pouvoir faire du SQL avec les données récupérées de ma BD

  10. #10
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut
    D'un point de vue purement SQL, pour récupérer une partie seulement, je ferais bien un SELECT TOP 1000 (par exemple pour les première lignes) ensuite un bon ORDER BY histoire d'avoir celle que tu veux vraiment en haut, et hop.

    Mais, ça c'est du SQL et pas du VB.

    Et je rejoins Keihilin, tu nous dis que tes requêtes sont optimisées au max, j'en suis pas sûr. tu aprle de table de 500 000 ligne et de TimeOut. Les TimeOut standard sont à 90 secondes et je peux te dire par expérience qu'une requête qu iretourne 500 000 ligne, même avec des jointures dans tous les sens, ça mets pas 90 secondes à remonter.

    Autre point sur le TimeOut : il se paramettre dans la chaine de connexion. Donc s'il est trop court tu peux l'augmenter. Enfin, regarde également les perf du serveur. Un serveur de BDD qui passe beaucoup de temps à 100 % de CPU est chartte, il faut soit rajouter de la RAM, soit le changer. J'ai le cas actuellement et j'ai optimiser à fond (même si je suis sûr qu'un gars comme SQLPro pourait encore faire du ménage) et on va changer le serveur car on voit bien qu'il est charette, trop de processus en cours en même temps.

  11. #11
    Candidat au Club
    Inscrit en
    Octobre 2007
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Bonjour Fannette,

    J'ai l'impression que vous n'etes pas sur la même longueur d'onde.
    Voici ce que j'ai compris de ton problème :

    Le timeout n'est pas la cause de ton souci mais la conséquence.
    Si j'ai bien compris la cause de ton souci sont les milliards de données qui sont dans ta BD alors que tu souhaite exécuter des requêtes que sur une partie de ces données (quelques milliers).
    Et comme tes requêtes sont complexes (certains logiciels analyses et triturent des données dans tous les sens, c'est peut etre le cas de fannette), si l'analyse se fait sur toute ta BD tu est confrontée au timeout.


    En conséquence tu veux pour simplifier les choses utiliser un dataset pour extraire une partie de ta BD et exécuter tes requêtes SQL sur ce dataset. Mais ca ne focntionne pas.

    est-ce bien cela ta problématique.

    Bien entendu, on peut toujours essayer d'optimiser des requêtes, mais la question posée n'est pas celle-là. alors essayons de répondre au problème posé.

  12. #12
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2006
    Messages
    400
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 400
    Points : 459
    Points
    459
    Par défaut
    (Re) Bonjour,

    Au delà de ça le maintien d'un Dataset en Session ne pourrait-il pas résoudre le problème?

    Aprés je vois mal comment faire du traitement BDD en .Net sans code (si j'a bien compris tu ne peux pas faire de VB)

    ...

  13. #13
    Candidat au Club
    Inscrit en
    Octobre 2007
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Le maintien d'un dataset en session ne résoud rien, car Fannette dit qu'il est impossible de faire des requetes SQL sur un dataset.

    Il nous faut lui proposer une autre solution pour effectuer ses requetes SQL sur une partie de sa BD.
    D'ailleurs cela me semble très logique : pourquoi effectuer des requetes sur toute la BD alors que seule une partie des données nous interresse.

  14. #14
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Non un dataset en session pourquoi faire puisque je peux pas faire de requete SQL avec un dataset (hormis dans un datarow sur une seule table...)

    Par contre si je peux mettre une partie de ma BD en session pour faire des requetes dessus la je suis OK ;-)

    Hormis la problématique de l'accès au données en .Net que tu ne sembles pas maîtriser à 100%, peut être y a-t-il aussi un petit travail à faire sur les requêtes en elles-mêmes.
    Ok peut etre que je maitrise pas les requêtes a 100% mais la problèmatique sur l'accés aux données ?????
    Meme si j'optimise mes requetes, peut etre que l'optimisation peu aussi passer par la sélection des données a interroger ?

  15. #15
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut
    Ben, si je comprends bien ton récap, parallele69, il suffirai de faire un proc stock qui fabrique des tables temporaires et faire les requêtes sur les tables temporaires. MAis, ça, ça relève du SQL et pas du VB.

    Donc, outre le fait qu'on ne soit pas dans le bon forum (mais c'est pas grave, on sait gérer) c'est surtout que le problème n'est pas posé de la bonne manière.

    Quoi qu'il arrive et au risque de devenir un peu chiant, je trouve qu'il nous manque un bon bout de contexte pour bien appréhender le problème.

    Moi, j'ai plus l'habitude de penser les solutions que de les mettre en application. Ma fonction d'ingénieur m'oblige à réfléchir avec une vue toujours plus globale. C'est aussi pour ça que j'ai des soucis avec les détails de programmation pure, je pense, je ne code pas.

    Donc, Fannette85 (j'espère que c'est pas pour la Vendée ce 85...... gnarf) s tu pouvais nous raconter un peu plus le contexte de ton application, je pense qu'on pourrait mieux t'aider.

  16. #16
    Inscrit

    Profil pro
    Inscrit en
    Février 2004
    Messages
    862
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2004
    Messages : 862
    Points : 1 229
    Points
    1 229
    Par défaut
    Citation Envoyé par parallele69 Voir le message
    pourquoi effectuer des requetes sur toute la BD alors que seule une partie des données nous interresse.
    d'où l'invention du mot-clé WHERE !

    On peut arrêter de dire n'importe quoi 5mn ?

    Etant donné sont premier message, j'ai les plus grosses craintes sur la façon de procéder de Fanette. Elle parle d'interroger une partie de sa BD (ce qui pourrait être interprêté comme un besoin de de division physique de sa BD), mais donne comme exemple une requête avec des jointures qui résoudrait son problème...

    Il est clair que nous sommes face à une débutante en .Net et sans doute en bases de données, donc avant de tirer des plans sur la comète, il serait judicieux qu'elle nous donne plus de détails sur sa BD actuelle et son code .Net afin que nous puissions la diriger vers les bonnes méthodes à appliquer.

  17. #17
    Inscrit

    Profil pro
    Inscrit en
    Février 2004
    Messages
    862
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2004
    Messages : 862
    Points : 1 229
    Points
    1 229
    Par défaut
    Citation Envoyé par Fanette85 Voir le message
    Meme si j'optimise mes requetes, peut etre que l'optimisation peu aussi passer par la sélection des données a interroger ?
    Je résume : tu veux faire des requêtes sur un résultat de requête, correct ?

    - Est-ce que tu veux diviser physiquement ta BDD ?
    - Est-ce qu'une simple vue sur SQL Server ne résoudrait pas ton problème ?

  18. #18
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Points : 8 734
    Points
    8 734
    Par défaut
    Citation Envoyé par Keihilin Voir le message
    Je résume : tu veux faire des requêtes sur un résultat de requête, correct ?

    - Est-ce que tu veux diviser physiquement ta BDD ?
    - Est-ce qu'une simple vue sur SQL Server ne résoudrait pas ton problème ?
    +1, je pense à une vue en lisant le problème

  19. #19
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    un besoin de de division physique de sa BD
    c'est peu etre ca ma réponse.

    Pour détailler ma BD

    table1
    Idtable1 (PK)
    Nom
    ...

    table2
    Idtable2 (PK)
    idTable1 (FK)
    nom
    ...

    table3
    Idtable3 (PK)
    idTable2 (FK)
    Nom

    Table4
    idTable4 (PK)
    Idtable2 (FK)

    J'utilise ces tables pour faire d'autre chose comme donner a l'utilisateur toutes les données suivant l'idTable1 .... ou autre

    jusqu'ici pas de souci tous fonctionnent parfaitement

    Mais en plus je dois lancer des requetes sur les tables 2,3 et 4 avec seulement les données correspondant à idTable1 = ..

    Si je pouvais faire une division physique des données, je pourrais interroger seulement les données qui m'interresse ?

    Vous avez peut être raison j'aurais du aller sur un Forum SQL server 2005 ...
    Mais je pensais récupérer mes données en mémoire comme avec un dataset.

  20. #20
    Membre averti

    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    249
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 249
    Points : 357
    Points
    357
    Par défaut
    Dans ce cas tu peux aussi balancer les données qui t'intéressent vraiment dans des tables temporaires et traiter le tout avec des procédures stockées, ce qui reste généralement le plus rapide...

    La procédure ne retournera que le résultat final...

Discussions similaires

  1. [Toutes versions] Requète SQL imbriqué
    Par Maxpuff dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 05/05/2010, 16h46
  2. Requêtes SQL imbriquées
    Par zpliz dans le forum SQL
    Réponses: 5
    Dernier message: 25/03/2010, 09h58
  3. [MySQL] Requête sql imbriquée
    Par PIEPLU dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 20/01/2010, 08h44
  4. Requête SQL imbriqué, 3 tables, plusieurs colonnes
    Par opacho dans le forum Requêtes
    Réponses: 3
    Dernier message: 27/07/2009, 09h45
  5. Requête SQL imbriquée
    Par cecile15 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 20/05/2009, 10h39

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