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

Bases de données Delphi Discussion :

Firebird Update avec Jointure


Sujet :

Bases de données Delphi

  1. #1
    Membre du Club Avatar de jcharles
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 82
    Points : 52
    Points
    52
    Par défaut Firebird Update avec Jointure
    Bonjour,

    je voudrai d'abord souhaiter une Bonne et Heureuse année aux responsables de ce Forum ainsi qu'a toutes les personnes qui font qu'il est unique.


    Apres des recherches en vain, je souhaiterai connaitre la syntaxe pour mettre à jour le champ d'une table avec le champ d'une autre table en jointure.

    Exemple:
    j'ai une table STAT avec mon code article et le champ à remplir
    une autre table ARTFOUR avec mon code article, la reference article du fournisseur
    une autre table FOURN avec mon code fournisseur et un champ "SELEC" pour savoir quel fournisseur est selectionner.

    Il faut que je met a jour le champ à remplir dans ma table STAT avec le champ reference article fournisseur de la table ARTFOUR seulement pour les fournisseur selectionner par le champ SELEC.

    j'en suis arrivé la dans ma requete avec le message d'erreur "Multiple rows in singleton select".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE StatVte SET REFOUR =
    (Select REFA FROM Statvte INNER JOIN FORBARFO ON StatVte.NART = FORBARFO.NART 
    INNER JOIN FORBFOUR ON FORBARFO.NFOU = FORBFOUR.NFOU WHERE FORBFOUR.SELEC=-1 and (REFA is not null) group by REFA)
    si vous avez une idée.......je suis preneur.
    MERCI d'avance.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 625
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 625
    Points : 25 326
    Points
    25 326
    Par défaut
    as-tu essayé une syntaxe plus direct ? Sans passer par une sous-requête, surtout que le moteur ne risque pas d'apprécié de mettre à jour la table de sa sous-requête !

    Par Jointure explicite

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE StatVte SET StatVte.REFOUR = Statvte.REFA 
    INNER JOIN FORBARFO ON StatVte.NART = FORBARFO.NART 
    INNER JOIN FORBFOUR ON FORBARFO.NFOU = FORBFOUR.NFOU 
    WHERE FORBFOUR.SELEC=-1 and (REFA is not null)
    ou
    Par Jointure à l'ancienne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    UPDATE StatVte, FORBARFO, FORBFOUR 
    SET StatVte.REFOUR = Statvte.REFA 
    WHERE FORBFOUR.SELEC=-1 and (REFA is not null) 
    AND StatVte.NART = FORBARFO.NART 
    AND FORBARFO.NFOU = FORBFOUR.NFOU

  3. #3
    Membre du Club Avatar de jcharles
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 82
    Points : 52
    Points
    52
    Par défaut
    Bonjour ShaiLeTroll,

    oui j'ai déja essayé la premiére et j'ai une erreur.....
    SQL Error Code = -104
    Token unknown - Line 2, char 1
    INNER
    et pour la deuxieme que je viens d'essayé, j'ai le même type erreur
    SQL Error Code = -104
    Token unknown - Line 1, char 15
    ,
    je fait une p'tit precision concernant les tables,
    la Table ARFOUR a plusieurs articles avec le même code article mais avec une reference fournisseur differente.
    la Table STAT n'a qu'un seul code article par article.

    Merci pour ton aide.

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 625
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 625
    Points : 25 326
    Points
    25 326
    Par défaut
    et une version avec un INNER implicite ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE StatVte SET StatVte.REFOUR = Statvte.REFA 
    JOIN FORBARFO ON StatVte.NART = FORBARFO.NART 
    JOIN FORBFOUR ON FORBARFO.NFOU = FORBFOUR.NFOU 
    WHERE FORBFOUR.SELEC=-1 and (REFA is not null)
    Je n'ai pas fait d'InterBase depuis 5 ans et je ne suis jamais allé très loin en SQL dessus (je générais mes requêtes en boucle, question de traçabilité et de mauvaises habitudes avec Paradox), ce que je propose c'est la syntaxe MySQL ...

  5. #5
    Membre du Club Avatar de jcharles
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 82
    Points : 52
    Points
    52
    Par défaut
    Non toujours même probléme......maintenant le message d'erreur est avec JOIN.

    je sais qu'il y a les boucles mais c'est tellement plus rapide quand on peut le faire en un requête que ........

    je continue de chercher.

    MERCI

  6. #6
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    pourquoi pas une procédure stocke, surtout que tu récupère plusieurs ligne dans ton Select
    "Multiple rows in singleton select".

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 167
    Points : 41 351
    Points
    41 351
    Billets dans le blog
    63
    Par défaut
    +1 @Edam

    ton problème c'est que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Select REFA FROM Statvte INNER JOIN FORBARFO 
    ON StatVte.NART = FORBARFO.NART 
    INNER JOIN FORBFOUR ON FORBARFO.NFOU = FORBFOUR.NFOU 
    WHERE FORBFOUR.SELEC=-1 and (REFA is not null)
    group by REFA)
    renvoi plusieurs valeurs (enregistrements) où UPDATE n'en attend qu'un seul. Une solution consisterait à mettre SELECT FIRST 1 etc.. mais je ne pense pas que ce soit le but recherché

    En fait , il faudrait la description des tables ,

    j'ai une table STAT avec mon code article et le champ à remplir
    une autre table ARTFOUR avec mon code article, la reference article du fournisseur
    une autre table FOURN avec mon code fournisseur et un champ "SELEC" pour savoir quel fournisseur est selectionner.
    c'est léger et même si implicite il faudrait indiquer les relations

    En fait je ne comprend pas le SQL de départ ?
    sauf si erreur de transcription, tel quel, tu modifies tous les enregistrements de Statvte avec (dans le cas de l'utilisation de FIRST pour eviter l'erreur ) la même valeur, je ne pense pas que ce soit le but ?
    La clause WHERE est-elle bien placée ?


    [EDIT] en relisant le SQL j'en viens à la proposition suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE STATVTE S SET S.REFOUR=
    (SELECT A.REFA FROM STATVTE T INNER JOIN FORARFO A ON T.NART=A.NART
    INNER JOIN FORBFOUR F ON A.NFOUR=F.NFOUR 
    WHERE F.SELEC=-1 AND (A.REFA IS NOT NULL) AND A.NART=S.NART)
    Mais, même ainsi, il manque encore quelque chose car encore une fois tous les enregistrements de STATVTE auront la même valeur REFOUR en fin de course.

    Une solution ? l'utilisation d'une procédure stockée et d'une boucle FOR DO , ou si Firebird >2.0 l'utilisation de CTE quoiqu'il me semble avoir lu sur le forum Firebird qu'un UPDATE avec des CTE n'était pas évident (Post récent)

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 167
    Points : 41 351
    Points
    41 351
    Billets dans le blog
    63
    Par défaut Solution Procédure
    soit
    Tables : champs
    STAT : CODEART,REFFOUR
    ARTFOUR : CODEART,CODEFOURN,REFARTFOUR
    FOURN : CODEFOURN,SELEC
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SET TERM ^;
    CREATE PROCEDURE UPDATE_STATS AS
    DECLARE VARIABLE ART INTEGER;
    DECLARE VARIABLE REF CHAR(15);
    BEGIN
     FOR (SELECT A.CODEART,A.REFARTFOUR FROM ARTFOUR A JOIN FOURN F 
            ON A.CODEFOURN=F.CODE_FOURN 
            WHERE F.SELEC=-1
            INTO :ART,:REF)
      DO  UPDATE STAT SET REFFOUR=:RF WHERE CODEART=:ART; 
    END ^
    SET TERM ; ^
    Non testé par manque de jeu d'essai , il y a peut être des : , parenthèses ou ; manquants ou en trop et bien sur les déclaration de variables sont fantaisistes

Discussions similaires

  1. UPDATE avec jointure
    Par warning dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 13/12/2007, 10h35
  2. Requête UPDATE avec jointure
    Par petburn dans le forum SQL
    Réponses: 7
    Dernier message: 30/07/2007, 14h22
  3. [UPDATE] avec jointure sur une requete
    Par userB dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 20/07/2007, 16h18
  4. Requete update avec jointure d'une requête
    Par bart64 dans le forum Requêtes et SQL.
    Réponses: 10
    Dernier message: 28/05/2007, 20h31
  5. [PL/SQL] update avec jointure
    Par Fox_magic dans le forum Oracle
    Réponses: 6
    Dernier message: 09/12/2004, 12h19

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