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

  1. #1
    Candidat au Club
    Réponse à SQL Exercice probleme no2_Le publipostage
    Bonjour,

    L'exercice SQL de A à Z Exercices et travaux pratique No2: Le publipostage correspond exactement à ce que je souhaite faire avec une base de données. Est-ce possible d'avoir une piste de solution...

    tps://sqlpro.developpez.com/Exercices/?page=part-1 (no2 Le publipostage)

    Merci!

  2. #2
    Rédacteur

    Il faut ajouter une table de nombre à la base :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    CREATE TABLE T_NUM (NUM INT PRIMARY KEY)

    L'alimenter avec les nombres de 1 à ...
    Puis faire une jointure de type :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    JOIN T_NUM AS I ON MaValeurmax <= I.NUM


    A +
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  3. #3
    Candidat au Club
    Il s'agit bien de ce problème?

  4. #4
    Rédacteur

    Oui.... J'en suis l'auteur !

    A +
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  5. #5
    Candidat au Club
    Désolée. Ma question trahie mon niveau de SQL… Merci pour votre réponse. (et j'avais bien identifié la sommité qui m'apportait lumière , merci pour vos travaux pour démystifier ce langage, cela est très apprécié).

    Est-ce possible avec une commande d'alimenter le champs num 1 à 5 sans passer par 1,2,3,4,5...
    Je souhaite que les valeurs soit séquentielle de 1 à la somme du contenu PRS_Nombre?

  6. #6
    Rédacteur

    oui, avec une requête récursive.... mais ce sera toujours beaucoup plus long que de créer une table en dur avec les nombres de 1 à 10000 par exemple.

    Création et alimentation de la table des nombres :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE dbo.T_NUM (NUM INT PRIMARY KEY);
    DECLARE @I INT = 0;
    WHILE @I < 10000
       BEGIN INSERT INTO dbo.T_NUM SELECT @I;
       SET @I += 1;
    END;


    Cela a pris 7 secondes chez moi...

    Vous pouvez mettre cette table dans un groupe de fichier en READ ONLY, ce qui est très avantageux en terme de performances...

    SOLUTION n°1 - avec la table en "dur" :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT T.*
    FROM   MaTable AS T
           JOIN dbo.T_NUM
              ON T_NUM.MonNombre <= NUM;


    SOLUTION n°2 - sans la table en "dur", mais avec calcul récursif :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    WITH 
    T_NUM AS
    (SELECT 1 AS NUM
     UNION  ALL
     SELECT NUM + 1
     FROM   T_NUM
     WHERE  NUM < 10000)
    SELECT T.*
    FROM   MaTable AS T
           JOIN T_NUM
              ON T_NUM.MonNombre <= NUM
    OPTION(maxrecursion 0);


    la solution n°1 étant nettement p^réfarable, car les données sont statiques alors que dans la 2 il faudra recalculer tous les nombres à chaque fois

    A +
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  7. #7
    Candidat au Club
    Merci!!! Je vais expérimenter toutes ces pistes...
    (j'utilise SQL developer / Oracle 11g)

    Erreur commençant à la ligne: 2 de la commande -
    DECLARE @I INT = 0;
    WHILE @I < 10000
    BEGIN INSERT INTO T_NUM SELECT @I;
    SET @I += 1;
    END;
    Rapport d'erreur -
    ORA-06550: Ligne 1, colonne 9 :
    PLS-00103: Symbole "@" rencontré à la place d'un des symboles suivants :
    begin function pragma procedure subtype type <identificateur>
    <identificateur entre guillemets> current cursor delete
    exists prior
    06550. 00000 - "line %s, column %s:\n%s"
    *Cause: Usually a PL/SQL compilation error.
    *Action:

  8. #8
    Modérateur

    Pour qu'Oracle comprenne ce que tu veux lui faire faire, il faut lui parler dans son dialecte.
    A première vue, tu essayes d'exécuter un script T-SQL destiné à SQL Server alors qu'Oracle ne comprend que le PL/SQL...
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  9. #9
    Candidat au Club
    Ce message n'a pas pu être affiché car il comporte des erreurs.

  10. #10
    Membre éclairé
    Bonjour,

    Dans Oracle la version classique pour générer n lignes c'est d'utiliser une requête hiérarchique avec CONNECT BY level <= n. Par exemple pour 5 lignes de 1 à 5:

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    select level n
    from dual 
    connect by level <= 5;

  11. #11
    Modérateur

    Citation Envoyé par BourassaMN Voir le message
    La solution suivante fonctionne dans le langage SQL developper:
    Il n'y a pas de langage SQL Developer. SQL Developer est un logiciel de consultation/administration de bases de données qui, bien que développé par Oracle, peut accéder aux SGBD d'autres éditeurs.

    Ici tu utilises le langage SQL avec les spécificités propres à Oracle dont fait partie le langage procédural PL/SQL.
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  12. #12
    Candidat au Club
    Merci Vanagreg!!! ça complète parfaitement les opérations dont j'ai besoin.

    Bonne journée!

###raw>template_hook.ano_emploi###