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

PostgreSQL Discussion :

comment créer une nouvelle table à partir d'une déjà existante?


Sujet :

PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 25
    Par défaut comment créer une nouvelle table à partir d'une déjà existante?
    Salut,
    j'aimerai créer une nouvelle table à partir d'une table déjà existante. La table existante a cette forme:

    tel_id | tel_home | tel_mobile | friends_id
    --------------------------------------------------------------------------------
    0000 | 1001 | 0601 | 100
    0001 | 1002 | 0602 | 100
    0002 | 1003 | 0603 | 200
    0003 | 1004 | 0604 | 200
    0004 | 1005 | 0605 | 300
    0005 | 1006 | 0606 | 400
    0006 | 1007 | 0607 | 400
    0007 | 1008 | 0608 | 400

    friends_id est une clé secondaire (en principe ca n'a pas d'importance).

    la nouvelle table devra ressembler à ceci:

    tel_id |tel_home1 |tel_mobile1 |tel_home2 |tel_mobile2 | friends_id
    ---------------------------------------------------------------------------------------
    0000 |1001 |0601 |1002 |0602 |100
    0001 |1003 |0603 |1004 |0604 |200
    0002 |1005 |0605 | | |300
    0003 |1006 |0606 |1007 |0607 |400

    c'est-à dire par ligne juste une seule fois friends_id et pour plus de 3 numéros(par ex. friends_id = 400), le troisième n° sera tout simplement abandonné.

    comment est-ce ke je pourrais faire cela avec PSQL?

    Merci de votre aide.

  2. #2
    Membre Expert
    Avatar de hpalpha
    Inscrit en
    Mars 2002
    Messages
    769
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 769
    Par défaut
    Bonjour,

    tu peux essayer une fonction comme ca :

    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
    16
    17
    18
    19
    CREATE TYPE typeperso AS ( tel_id varchar, tel_home1 varchar, tel_mobile1 varchar, tel_home2 varchar, tel_mobile2 varchar, friends_id varchar);
     
    CREATE OR REPLACE FUNCTION transform_table() RETURNS SETOF typeperso AS
    $BODY$
    DECLARE
     rec record;
     o typeperso;
    BEGIN
     FOR rec IN SELECT friends_id FROM matable GROUP BY friends_id ORDER BY friends_id
     LOOP
       o.friends_id:=rec.friends_id;
       SELECT INTO o.tel_id,o.tel_home1,o.tel_mobile1 tel_id,tel_home,tel_mobile FROM matable WHERE friends_id = rec.friends_id ORDER BY tel_id LIMIT 1 OFFSET 0;
       SELECT INTO o.tel_home2,o.tel_mobile2 tel_home,tel_mobile FROM matable WHERE friends_id = rec.friends_id ORDER BY tel_id LIMIT 1 OFFSET 1;
       RETURN NEXT o;
     END LOOP ;
     RETURN ;
    end;
    $BODY$
    LANGUAGE 'plpgsql' ;
    pour l'utiliser

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM transform_table()
    Il y a surrement plus optimisé mais je pense que deja ca te permettra d'avancer.

  3. #3
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 25
    Par défaut
    Merci, merci, merci.

    J'essaie et je te tiens informé!
    Bon week-end!

  4. #4
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 25
    Par défaut
    Salut,

    pour m'assurer avoir compris l'exemple proposé plus haut et après avoir longuement lu le tutoriel, j'ai essayé pour résoudre mon probleme le code suivant que j'exécute dans le shell. Ma question est de savoir pourkoi est-ce ke je recois l'erreur qui suit le code? Et est-ce ke les 'expression [index]' sont-ils bien utilisé dans la mesure où je voudrais vérifier une ligne et la suivante ?

    CREATE OR REPLACE FUNCTION transform_table_address() RETURNS SETOF attribut_address_2 AS $BODY$

    DECLARE
    rec RECORD,
    o attribut_address_2,
    index INTEGER
    BEGIN
    SELECT rec.name1, rec.name2, rec.street, rec.zip, rec.zipcity, rec.country, rec.state FROM address

    WHILE rec.company_id[index] = rec.company_id[index + 1] AND rec.street[index + 1] NOT NULL

    LOOP RETURN NEXT O(rec.name1, rec.name2, rec.company_id, rec.street, rec.zip [index +1], rec.zipcity[index +1], rec.country[index+1], rec.state[index + 1])

    IF rec.company_id[index] = rec.company_id [index +1+1] THEN NULL
    END IF
    END LOOP
    RETURN
    END
    $BODY$ LANGUAGE 'plpgsql';
    --voici l'erreur
    ERROR: parser: parse error at or near "$" at character 90

  5. #5
    Membre Expert
    Avatar de hpalpha
    Inscrit en
    Mars 2002
    Messages
    769
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 769
    Par défaut
    Je pense qu'il y a beaucoup d'erreur dans ce code :

    - il manque des points virgules a chaque fin d'instruction (déclaration des variables aussi)
    - evite d'utiliser des mots clefs dans tes variables comme index
    - un type record est une ligne pas une sorte de array, on ne peut donc pas acceder a l'enregistrement suivant avec un index
    - rec.company_id[index] = rec.company_id[index + 1] AND rec.street[index + 1] NOT NULL ne retourne pas un boolean fait plutot rec.company_id[index] = rec.company_id[index + 1] AND rec.street[index + 1] IS NOT NULL
    - essaye d'identer ta fonction, c'est plus facile pour debuger

    en tout cas c'est un bel effort, continue comme ca, tu va voir meme si plpgsql est un language simple, ca va te faciliter la vie dans bien des situations

  6. #6
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 25
    Par défaut
    C'est motivant les encouragements du genre!

    Quand j'entre le code dans le shell avec des points virgules, je recois des erreurs, mais en les enlevant elles disparaissent toutes jusqu'à celle cité plus haut.
    J'ai aussi essayé le code que tu m'as proposé en le restructurant en fonction de de mes besoins, mais toujours la meme erreur.

    Je continue en tout cas de chercher.

    PS: c'est koi identer une fonction?

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

Discussions similaires

  1. [AC-2007] création d'une nouvelle table à partir d'une ancienne.
    Par sanzo-iko dans le forum Access
    Réponses: 2
    Dernier message: 16/06/2010, 14h02
  2. Réponses: 1
    Dernier message: 02/10/2009, 13h42
  3. Réponses: 3
    Dernier message: 30/09/2009, 14h15
  4. Réponses: 5
    Dernier message: 09/09/2007, 16h40
  5. Réponses: 4
    Dernier message: 11/10/2006, 09h51

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