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 :

Remplir une table SANS CURSEUR, mais avec INSERT INTO SELECT uniquement


Sujet :

Développement SQL Server

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut Remplir une table SANS CURSEUR, mais avec INSERT INTO SELECT uniquement
    Bonjour, bonjour,

    Allez, je m'y recolle, j'ai encore 1 fois besoin de vos lumières!
    Nul doute que vous allez m'éclairer en 3 secondes, comme toujours...

    la base:
    - 3 tables:
    * client (nocli, nomcli, adressecli, flag_cde, ...)
    * commande (nocde, montant, nocli, ...)
    * lignes de commande (nolig, nocde, article, qte, prix, ...)

    le but:
    - parcourir les clients
    - pour tous les clients ayant une commande en cours (flag_cde = 1)
    * trouver la/les n commandes en cours
    * récupérer la/les n lignes de chaque commande
    - et insérer tout ça dans une table temporaire (nocli, nomcli, adressecli, nocde, article, qte, prix) avec donc une ligne complète (article, commande, client) pour chaque ligne de commande!

    la contrainte:
    - volume de données et optimisation oblige: PAS DE CURSEUR!!
    - uniquement INSERT INTO SELECT............

    Voilà, avec des curseurs & des boucles pour les parcourir, finger in the nose, ok,............ mais là, avec juste des insert into select, je ne vois pas...........

    J'ai déjà cherché des infos sur le sujet, mais j'ai besoin d'un exemple concret pour comprendre le "truc"...

    Une idée?
    Merci.

    PS: c'est peut être débile à vos yeux, ou tout ce que vous voulez, mais restons sur cet exemple précis, juste pour m'aider à comprendre la mécanique!

  2. #2
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Citation Envoyé par steph68b Voir le message
    J'ai déjà cherché des infos sur le sujet, mais j'ai besoin d'un exemple concret pour comprendre le "truc"...

    Une idée?
    Sans vouloir être méchant, tu ne sais pas faire des jointures ?

    Parce que c'est clair qu'avec des curseurs, ça va être lent !

    J'imagine que tu fais un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CURSEUR pour chaque client, chercher les commandes
      CURSEUR pour chaque commande, chercher les lignes
        CURSEUR pour chaque ligne
          INSERT
    Dans ce cas, il faut vite arrêter de programmer en SQL comme si c'était du COBOL...

    En SQL, on fait des jointures :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    table Client
    JOINTURE table Commande
    JOINTURE table LigneCommande
    Les jointures en SQL, c'est la base.
    Donc il va falloir chercher un peu (on ne va pas te prendre par la main...).
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  3. #3
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    7 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 7 966
    Points : 30 778
    Points
    30 778
    Billets dans le blog
    16
    Par défaut
    steph68b,



    Quand vous utilisez cette notation non formelle, mais courante :

    commande (nocde, montant, nocli, ...)

    En soulignant les noms des attributs, vous sous-entendez qu’ils composent la clé de la table : on va supposer ici que nocli n’en fait pas partie...


    Comme l’a laissé sous-entendre Pierre, la jointure est l’opération par excellence pour manipuler les bases de données relationnelles. C’est Ted Codd qui l’a inventée en 1969 (E. F. Codd, Derivability, Redundancy and Consistency of Relations Stored in Large Data Banks) et elle permet de se contenter d’ une instruction quand auparavant il fallait monter un appareillage de fichiers (au bas mot 50 instructions) pour traiter l’exercice.

    Ainsi, pour « appareiller » (pardon pour ce terme antédiluvien) les clients et leur commandes, on utilise la jointure naturelle (jointure pour abréger) :

    En relationnel pur :

    (1) CLIENT JOIN COMMANDE

    EN SQL (norme SQL:1992) :

    (2) CLIENT NATURAL JOIN COMMANDE

    Ou :

    (3) CLIENT JOIN COMMANDE ON CLIENT.Nocli = COMMANDE.Nocli

    Ou :

    (4) CLIENT JOIN COMMANDE USING (Nocli)

    Ou (norme SQL:1989) :

    (5) CLIENT, COMMANDE WHERE CLIENT.Nocli = COMMANDE.Nocli


    Chez DVP, c’est la version (3) qui est la plus utilisée. Ainsi, pour obtenir les clients et leurs commandes :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT CLIENT.Nocli, CLIENT.Nomcli, CLIENT.Adressecli, COMMANDE.Montant, COMMANDE.Datecde
    FROM   CLIENT JOIN COMMANDE ON CLIENT.Nocli = COMMANDE.Nocli ;

    De la même façon, pour obtenir les lignes de commande d’une commande :

    COMMANDE JOIN LIGNE_COMMANDE ON COMMANDE.Nocde = LIGNE_COMMANDE.Nocde


    Pour compléter la requête SQL (la jointure naturelle est associative) :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT CLIENT.Nocli, CLIENT.Nomcli, CLIENT.Adressecli, COMMANDE.Montant, COMMANDE.Datecde,
           LIGNE_COMMANDE.article, LIGNE_COMMANDE.prix, LIGNE_COMMANDE.qte
    FROM   CLIENT JOIN COMMANDE ON CLIENT.Nocli = COMMANDE.Nocli
                  JOIN LIGNE_COMMANDE ON COMMANDE.Nocde = LIGNE_COMMANDE.Nocde ;

    Inutile de faire participer l’attribut flag_cde (redondant, donc inutile), car la jointure naturelle suffit pour ne pas retenir les client sans factures.
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  4. #4
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    Hello,

    Je me suis mal exprimé sur mon exemple... mais peu importe... j'ai réglé mon problème depuis.
    Mais merci de ta participation.

    @+

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

Discussions similaires

  1. Réponses: 17
    Dernier message: 17/10/2013, 10h24
  2. [2008] Remplir une table sans aucune transformation
    Par phenomeno dans le forum SSIS
    Réponses: 5
    Dernier message: 28/03/2011, 15h31
  3. Réponses: 1
    Dernier message: 09/10/2008, 12h58
  4. Remplir une table temporaire, curseur ou pas?
    Par SoBaKa dans le forum Langage SQL
    Réponses: 3
    Dernier message: 25/10/2007, 10h15
  5. Réponses: 2
    Dernier message: 17/10/2006, 11h54

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