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

Développement SQL Server Discussion :

Problème de mise en place pour une stored procedure [2008R2]


Sujet :

Développement SQL Server

  1. #1
    Candidat au Club
    Homme Profil pro
    Demi-etudiant en Programmation
    Inscrit en
    Novembre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Demi-etudiant en Programmation
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2015
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Problème de mise en place pour une stored procedure
    Bonjour a tous,

    Je tiens d'abord à m'excuser pour l'intitulé un peu (beaucoup) flou. Je ne savais pas comment expilquer mon soucis en si peu de ligne...

    Alors voila, j'ai actuellement deux tables, contenant des infos diverses et reliées entre elles par un id unique.

    La première contient des informations générales (que j’appellerais table1), la seconde une sorte "d'historique plus détaillé" de la première table (que j'appellerais table2).

    Mon soucis étant que j'aimerais bien créer une stored procedure qui m'afficherais en results la première table (table1) et les infos les plus récentes stockées dans mon historique (table2).

    Un schema seras plus comprehensible que des mots je pense!

    Nom : Untitled (4).png
Affichages : 134
Taille : 21,7 Ko

    Etant donné que je suis novice en transact sql et sql server j'ai uniquement réussi à créer deux results differents mais pas a les lier dans un nouveau tableau...

    J'affiche d'une part le contenu de mon premier tableau puis la ligne de l'historique de ma deuxieme table en entrant l'id en dur...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    --affichage basique de ma premiere table
     SELECT [NAME], [DATE], [RESUME], FROM TABLE1
     
    --affichage de la ligne la plus récente de ma seconde table
    SELECT top 1 [DATE], [HISTORIQUE], [STATUT] FROM TABLE2 WHERE ID=1 ORDER BY DATE DESC
    L'idée est assez claire dans ma tete mais les différentes possibilités pour la mettre en place le sont nettement moins...
    (J'ai essayé avec des jointures, mais mon manque de pratique et mes tables ayant peu de colonnes en communs j'ai lamentablement échoué... De meme pour les tables temporaires )

    Merci d'avance si vous prenez un peu de temps pour m'aider!

    Avec cordialitude,
    Antonio

  2. #2
    Invité
    Invité(e)
    Par défaut
    On pourrait faire la job à ta place, mais ça serait bien plus pédagogique pour toi de lire un cours ( genre http://sqlpro.developpez.com/cours/sqlaz/jointures/ ), d'essayer et de nous revenir avec ce que tu as essayé pour des questions concrètes.

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    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 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par 7gyY9w1ZY6ySRgPeaefZ Voir le message
    On pourrait faire la job à ta place, mais ça serait bien plus pédagogique pour toi de lire un cours ( genre http://sqlpro.developpez.com/cours/sqlaz/jointures/ ), d'essayer et de nous revenir avec ce que tu as essayé pour des questions concrètes.
    Oui, et profitez en pour indiquer à votre tuteur, puisque visiblement il s'agit d'un exercice de cours

    - qu'un varchar (10) est une bêtise, on grignote quelques malheureux octets, au détriment d'une utilisation moins confortable et surtout d'une baisse fréquente des performances.
    A remplacer par du char(10)
    - Qu'un statut ne doit jamais être un libellé mais un code, la aussi pas de varchar, mais un char court ou un numérique selon le type de code.

  4. #4
    Candidat au Club
    Homme Profil pro
    Demi-etudiant en Programmation
    Inscrit en
    Novembre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Demi-etudiant en Programmation
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2015
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Bonsoir 7gyY9w1ZY6ySRgPeaefZ et escartefigue,

    J'avais deja "feuilleté" le cours que tu m'as posté ci dessus 7gyY9w1ZY6ySRgPeaefZ mais je n'étais pas sur d'y trouver mes réponses. Etant donné que tu me le recommande je vais m'y replonger plus en détail !

    Escartefigue,
    J'ai bien noté la "betises" pour le varchar et le statut et ne la reproduirais donc plus.

    Par contre il ne s'agit pas d'un exercice de cours , en effet je suis actuellement employé à temps plein dans un entreprise.
    Sql server et la sql en général n'étant pas mon domaine de prédilection je suis donc encore débutant et mon projet nécessitant cette "jointure" tres tres complexe a mes yeux je me suis donc permis de poster ce message étant donné que j'ai des délais a respecter.

    Voila maintenant que j'ai un peu éclairci la situation et que tout est noté et je me replonge des a present dans l'apprentissage de ce cours.

    PS: 7gyY9w1ZY6ySRgPeaefZ je ne voulais absolument pas vous brusquer ni demander une réponse toute prete servie sur un plateau mais seulement des indications sur une maniere de faire !
    Désolé si le message était maladroit et longue vie au sirop d'érable !

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par PersoID Voir le message
    Par contre il ne s'agit pas d'un exercice de cours , en effet je suis actuellement employé à temps plein dans un entreprise.
    Sql server et la sql en général n'étant pas mon domaine de prédilection je suis donc encore débutant et mon projet nécessitant cette "jointure" tres tres complexe a mes yeux je me suis donc permis de poster ce message étant donné que j'ai des délais a respecter.
    Vous n'avez jamais fait de jointure dans votre formation ? Je sais que le SQL est rarement étudié sérieusement mais dans les 2-3 heures de cours sur le sujet, c'est au moins abordé, non ?

  6. #6
    Candidat au Club
    Homme Profil pro
    Demi-etudiant en Programmation
    Inscrit en
    Novembre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Demi-etudiant en Programmation
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2015
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par 7gyY9w1ZY6ySRgPeaefZ Voir le message
    Vous n'avez jamais fait de jointure dans votre formation ? Je sais que le SQL est rarement étudié sérieusement mais dans les 2-3 heures de cours sur le sujet, c'est au moins abordé, non ?
    Tout au long de mon cursus c'est a moi de "choisir" les langages que je souhaite travailler (ce qui as ses avantages et ses inconvénients je l'accorde).
    De ce fait, lors de ma premiere année j'ai alegrement boycotter la sql (chose que je ne reproduirais pas en seconde année pour sur !).

    Mais en suivant le cours que tu m'as conseillé j'ai réalisé une jointure qui fais presque ce que je lui demande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    select	        Table1.name, 
    		Table1.date, 
    		Résumé,
    		Table2.Date as 'Histodate',
    		historique,
    		statut
     
    from table1
    left outer join table2
    on table1.ID = table2.Id
    order by table2.Date desc
    J'ai donc ma jointure qui fonctionne (le cours était en effet bien utile).
    Mais j'ai rencontré un deuxième soucis;
    Lors de mes différents essais de requetes je n'arrive jamais a afficher uniquement l'historique le plus "récent".
    En considerant que mon historique comporte ce qu'on pourrait appeler des "doublons" (plusieurs fois le meme id) je n'arrive pas à les sortir et a la fois faire ma jointure.
    Des idées ?
    Actuellement j'essaye avec un distinct mais si je rajoute d'autres nom de colonnes dans le select il outrepasse le distinct et me réaffiche les doublons...

  7. #7
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    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 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Il y a plusieurs façons de chercher l'enregistrement le plus récent ou le plus ancien :
    - utiliser les fonctions MAX ou MIN
    - vérifier l'existence d'un enregistrement dont la date est plus ancienne ou plus récente
    - utiliser une fonction de fenêtrage et ne conserver que le rang1
    - faire une jointure outer en recherchant une date > ou < et vérifier que le résultat est null

    La deuxième méthode est en générale la plus performante, elle donne ceci dans votre cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    select	        T1.name, 
    		T1.date, 
    		T1.Résumé,
    		T2.date as Histodate,
    		T2.historique,
    		T2.statut
    from table1 as T1
    left outer join table2 as T2
      on T1.ID = T2.Id
    where not exists
         (select 1 from table2 as S2
          where S2.ID   = T2.ID
            and S2.DATE > T2.DATE)
    order by T2.Date desc
    L'ajout de la sous-requête contraint à l'ajout d'alias, puisque la même table est utilisée 2 fois
    J'ai également ajouté les alias devant chaque colonne du select, y compris quand ce n'est pas obligatoire, c'est une habitude qui facilite la lecture : on voit de suite d'où proviennent les informations que l'on sélectionne

  8. #8
    Candidat au Club
    Homme Profil pro
    Demi-etudiant en Programmation
    Inscrit en
    Novembre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Demi-etudiant en Programmation
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2015
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Merci à toi escartefigue pour cette réponse rapide et beaucoup plus simple que ce que j'essayais de faire!
    J'étais parti dans des views en utilisant des MAX comme tu le disais et je m'emmêlais un peu les pinceaux

    Ta méthode marche impeccable, et l'ajout d'alias est en effet beaucoup plus clair c'est noté !
    Je pense peut etre modifier un tout petit peu ta requete car imaginons que deux personnes répondent en meme temps, alors la requete finale afficherait deux fois le meme id ?

    Nom : Untitled (5).png
Affichages : 96
Taille : 5,1 Ko


    Si je rajoute une colonne disons "D_id" qui s'incremente toute seule dans ma table2, il ne me resterait plus qu'a afficher la D_id le plus haut des 2 pour résoudre mon problème ?

    Encore merci de votre aide !
    Et je promet de consacrer une partie importante de ma seconde année au langages sql (ca m'evitera de passer pour un idiot )!
    Antonio

  9. #9
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    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 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Je n'y avais pas prêté attention, mais je vois que le nom de certaines colonnes contient des accents
    Ce n'est pas recommandé et pas compatible avec tous les SGBD

    Pour ce qui concerne un identifiant auto-incrémenté, c'est souvent LA solution pour créer la clef primaire d'une table, et elle peut bien évidemment servir aussi pour n'afficher qu'une seule occurrence dans le cas où plusieurs lignes possèdent la même date.

  10. #10
    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,

    Citation Envoyé par escartefigue Voir le message
    Il y a plusieurs façons de chercher l'enregistrement le plus récent ou le plus ancien :
    - utiliser les fonctions MAX ou MIN
    - vérifier l'existence d'un enregistrement dont la date est plus ancienne ou plus récente
    - utiliser une fonction de fenêtrage et ne conserver que le rang1
    - faire une jointure outer en recherchant une date > ou < et vérifier que le résultat est null

    La deuxième méthode est en générale la plus performante
    La troisième est souvent encore mieux, même si cela dépend de nombreux facteurs, notamment le volume et la répartition des données (ainsi que les indexs disponibles).
    Dans tous les cas, elle est donc a essayer. @PersoID, allez donc jeter un œil du coté de RANK, DENSE_RANK et ROW_NUMBER.

  11. #11
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    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 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Bonjour,



    La troisième est souvent encore mieux, même si cela dépend de nombreux facteurs, notamment le volume et la répartition des données (ainsi que les indexs disponibles).
    Dans tous les cas, elle est donc a essayer. @PersoID, allez donc jeter un œil du coté de RANK, DENSE_RANK et ROW_NUMBER.
    C'est pourquoi il faut toujours expérimenter pour tenir compte du contexte local.

    Cela dit, la fonction de fenêtrage présente 2 inconvénients par rapport à une requete exists :
    - elle nécessite des tris, ce qui a un coût
    - elle construit une table de résultat ce qui prend de la place mémoire

  12. #12
    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
    certes, mais concernant le tri, on peut supposer qu'un index existe. et dans le cas contraire, la sous requete avec EXISTS sera un vrai carnage !

    par ailleurs, cette solution apporte l'avantage majeur de ne faire qu'un seul accès aux données.

    Mais en effet, dans tous les cas, il faut tester !

  13. #13
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    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 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Non ce n'est pas la même chose :
    - avec exists, on recherche 1 seule occurrence pour la valeur d'index, donc inutile de trier
    - avec un fenêtrage on parcourt toutes les occurrences de l'index, et, si la séquence de l'index n'est pas la bonne (asc au lieu de desc ou inversement), il faut en plus trier

    Dans les 2 cas, si pas d'index c'est évidemment la bérézina

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

Discussions similaires

  1. [AC-2000] Problème de mise en place d'une base de données
    Par ariakas69 dans le forum Access
    Réponses: 7
    Dernier message: 01/08/2014, 10h04
  2. Réponses: 0
    Dernier message: 11/04/2012, 16h55
  3. Réponses: 9
    Dernier message: 18/01/2012, 22h13
  4. [Structure de données] Aide pour mise en place d'une structure de donnée
    Par HqSeO dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 28/06/2010, 17h05
  5. Problème de mise en place de datasource pour Hibernate
    Par K-Kaï dans le forum Tomcat et TomEE
    Réponses: 6
    Dernier message: 27/07/2006, 10h41

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