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

Requêtes PostgreSQL Discussion :

INSERT avec SELECT et jointures


Sujet :

Requêtes PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2004
    Messages
    190
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Avril 2004
    Messages : 190
    Par défaut INSERT avec SELECT et jointures
    Salut a tous,

    Je suis actuellement bloque sur une requete.
    Voici d'abord les 2 tables en question:
    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
    CREATE TABLE tbl_epc
    (
      fld_id integer NOT NULL,
      cal_status character varying(50) DEFAULT NULL::character varying,
      ...,
      CONSTRAINT tbl_epc_pkey PRIMARY KEY (fld_id)
    )
     
    CREATE TABLE tbl_epc_history
    (
      fld_id integer NOT NULL,
      fld_epc_id integer,
      fld_event character varying(250) DEFAULT NULL::character varying,
      fld_date timestamp without time zone,
      fld_notes character varying(4000) DEFAULT NULL::character varying,
      CONSTRAINT tbl_epc_history_pkey PRIMARY KEY (fld_id)
    )
    Donc chaque element de tbl_epc peut avoir plusieurs elements de tbl_epc_history lies a lui via fld_epc_id.

    La requete que je voudrais faire:
    Pour chaque EPC dont cal_status = 'Closed' ET ayant un element de tbl_epc_history avec fld_event = 'Project Started' ET n'ayant pas d'element avec fld_event = 'Project Closed', je desire leur rajouter un element dans tbl_epc_history avec
    fld_epc_id = celui de l'EPC concerne, fld_event = 'Project Closed' et fld_date = '30-11-2008'.

    Voila la requete que j'ai commence mais qui ne fonctionne pas parce que j'arrive pas a filtrer sur l'EPC courrant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    INSERT INTO tbl_epc_history (fld_id,fld_epc_id, fld_event, fld_date)
    SELECT (
    	(SELECT 1+MAX(fld_id) FROM tbl_epc_history),
     
    	(SELECT t2.fld_id FROM tbl_epc AS t2, tbl_epc_history AS t1
    	WHERE t2.cal_status = 'Closed' AND t2.fld_id NOT IN (
    			SELECT fld_epc_id FROM tbl_epc_history 
    			WHERE fld_event = 'Project Closed')
    		AND t2.fld_id IN (
    			SELECT fld_epc_id FROM tbl_epc_history 
    			WHERE fld_event = 'Project Started')
    		AND t2.fld_id = t1.fld_epc_id),
    	'Project Closed',
    	'30-11-2008');
    Faudrait que j'utilise des INNER JOIN mais j'ai vraiment du mal a m'y faire

    Une idee?

  2. #2
    Membre confirmé
    Inscrit en
    Avril 2004
    Messages
    190
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Avril 2004
    Messages : 190
    Par défaut
    J'ai reussi a creer la requete mais maintenant j'ai une erreur a cause de la cle primaire. Ma table n'est pas configurer pour s'auto-incrementer (c'est volontaire). Apparement le "(SELECT 1+MAX(fld_id) FROM tbl_epc_history)" ne marche pas
    Comment faire? Sachant que j'ai deja des donnees dans ma table avec leur propre id.
    Voici la requete en question:
    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
    INSERT INTO tbl_epc_history (fld_id,fld_epc_id, fld_event, fld_date)
    SELECT 
     
    	(SELECT 1+MAX(fld_id) FROM tbl_epc_history),
    	hist.fld_epc_id,
    	'Project Closed',
    	'30-11-2008'
     
    	FROM tbl_epc_history AS hist, tbl_epc AS epc
    	WHERE hist.fld_epc_id IN (SELECT t2.fld_id FROM tbl_epc AS t2, tbl_epc_history AS t1
    		WHERE t2.cal_status = 'Closed' AND t2.fld_id NOT IN (
    			SELECT fld_epc_id FROM tbl_epc_history 
    			WHERE fld_event = 'Project Closed')
    		AND t2.fld_id IN (
    			SELECT fld_epc_id FROM tbl_epc_history 
    			WHERE fld_event = 'Project Started')
    		AND t2.fld_id = t1.fld_epc_id)
    	GROUP BY hist.fld_epc_id;

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    Ce qui est attendu, c'est que l'INSERT créée une seule nouvelle ligne ou plusieurs?

  4. #4
    Membre confirmé
    Inscrit en
    Avril 2004
    Messages
    190
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Avril 2004
    Messages : 190
    Par défaut
    Plusieurs ligne. Une pour chaque EPC correspondant au critere du SELECT.

    Sinon, de mon cote j'ai finalement reussi a rajouter les lignes sans avoir le probleme de cle primaire duplique.
    En fait j'ai bricole!
    J'ai cree un nouvelle table temporaire ayant la meme structure que la table tbl_epc_history mais avec la cle primaire auto-incremente.
    J'ai ensuite lance cette requete d'insert mais sur la table temporaire.
    Ensuite j'ai pris le dernier id de tbl_epc_history (l'original) et j'ai fait un UPDATE de tous les id de la temporaire en ajoutant la valeur de ce dernier id.
    Enfin, j'ai fait un INSERT dans tbl_epc_history en faisant un SELECT * de la temporaire

    C'est tire par les cheveux mais ca a marche tres bien

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    En tout cas il est normal que sur une exécution particulière, la sous-requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT 1+MAX(fld_id) FROM tbl_epc_history
    renvoie toujours la même valeur, d'où le problème si cette valeur est utilisée en clef primaire.
    Ca serait jouable si l'INSERT ne concernait qu'une seule nouvelle ligne à chaque fois.

    L'autre solution sans table temporaire serait d'ajouter à cette expression 1+max(fld_id) un numéro de ligne sur la base de la fonction row_number() qui est disponible à partir de PG 8.4

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

Discussions similaires

  1. Requete insert avec select
    Par nanette38 dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 26/03/2008, 16h21
  2. Probleme INSERT avec SELECT depuis un DBLINK
    Par peetez dans le forum SQL
    Réponses: 3
    Dernier message: 25/07/2007, 23h32
  3. Requete deffectueuse Insert avec select
    Par Dargos dans le forum Langage SQL
    Réponses: 3
    Dernier message: 10/05/2007, 13h58
  4. Insert avec select sur table avec Trigger d'insertion
    Par bran_noz dans le forum Développement
    Réponses: 5
    Dernier message: 23/12/2005, 14h38
  5. Insert avec select
    Par Alexandre` dans le forum Langage SQL
    Réponses: 11
    Dernier message: 25/01/2005, 15h16

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