[Résolu]Update entre 2 tables

Discussions sur le module de base de données Base et plus particulièrement sur le langage SQL ou sur les connexions aux SGBD tiers.
Les questions sur les macros doivent être postées dans la section dédiée en dessous.

Modérateur : Vilains modOOs

Règles du forum
Cette section est dédiée au module Base et plus particulièrement sur le langage SQL ou sur les connexions aux SGBD tiers. Vous ne devez pas poster ici de questions sur les macros mais utiliser la section éponyme.
Pour accélérer les réponses, vous pouvez mettre en ligne votre base en joignant un fichier ODB : comment faire.
HRk2o
Membre cOOnverti
Membre cOOnverti
Messages : 344
Inscription : 29 mai 2009 08:51
Localisation : Guyane

[Résolu]Update entre 2 tables

Message par HRk2o »

Bonjour,
mes recherches sur la question mainte fois posée sur le forum ne m’ont pas permis de trouver la bonne solution à mon cas, malgré les adaptations effectuées.

Contexte :
Au départ, 2 fichiers de même structure., 2 tables = "T_DOSSIER" et "T_ARCHIVE" liée par "ID_DOSSIER" et "NUMDOS" dans un sous formulaire
Le fichier 1 (F1)= numéro impair et le fichier 2 (F2) = pair
Je fusionne F1 et F2 ainsi : (ex F2 vers F1)
copie de table "Dossier" F2 vers table "Dossier" F1 hors "ID_DOSSIER" F2 ;
copie de table "Archive" F2 vers table "Archive" F1 hors "REF_DOSSIER" F2 ;
J’obtiens donc dans F1 une suite continue de numéros impairs et pairs dans la table "T_DOSSIER" et dans la table "T_ARCHIVE".
Il me reste à mettre à jour dans la table "T_ARCHIVE" le champ" REF_DOSSIER" car vide, et qui doit correspondre par leur numéro pair au "ID_DOSSIER" de "T_DOSSIER" .

J’ai essayé :

Code : Tout sélectionner

update "T_ARCHIVE" SET "REF_DOSSIER" = select "ID_DOSSIER" from "T_DOSSIER" where "NUMDOS" = "T_ARCHIVE"."REF_NUMDOS" AND "T_ARCHIVE"."ARCHIVE_LE" IS NOT NULL AND "T_ARCHIVE"."REF_DOSSIER" IS NULL
cela me retourne : single value expected
je n’arrive pas à comprendre pourquoi !

Une idée !
update table .odb
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par HRk2o le 22 mai 2018 22:11, modifié 1 fois.
AOO 4.1.14 et LO 7.3.7.2 sous OsX 10.13.6 High Sierra ; Windows 10 sous AOO 4.1.14 et LibO 7.3.7.2
Avatar de l’utilisateur
martinbrait
InconditiOOnnel
InconditiOOnnel
Messages : 753
Inscription : 09 avr. 2013 07:15
Localisation : T'as pas dit bonjour, merci et à bientot !

Re: Update entre 2 tables

Message par martinbrait »

Essayer, encore et toujours...

-- sous HSQL, l'implicit select ne se fait pas !!!
-- Comment faire une mise à jour entre deux tables ?

Code : Tout sélectionner

    UPDATE "Table2" SET "Table2"."Champx" = 'dd'
    WHERE "Table2"."ChampClef" IN
    (SELECT "Table1" from "Table2","Table1" WHERE "Table2"."ChampClef"= "Table1"."ChampClefRelatif")

-- mise à jour d'un champ avec une table liée

Code : Tout sélectionner

    UPDATE "Table1"
    SET "Champ1"= (SELECT "ChampEquiv1" FROM "Table2"
    WHERE "Table1"."ChampCle" = "Table2"."ChampCleRelatif")

-- update de 2 champs entre 2 tables liées :

Code : Tout sélectionner

        UPDATE "Table2" SET "nom" = (SELECT "nom" FROM "Table1" WHERE "idk" = "Table2"."idk"),"prenom" = (SELECT "prenom" FROM "Table1" WHERE "idk" = "Table2"."idk")

Code : Tout sélectionner

UPDATE "Clients" 
SET "Nom" = (SELECT "Nom" FROM "AjoutClients" WHERE "AjoutClients"."ID" = "Clients"."ID")

Code : Tout sélectionner

UPDATE "tbl-articles" 
SET "PrixHT" = (SELECT "Prixnet" FROM "tbl-tarifs" WHERE "Reffrs" = "tbl-articles"."reffrs") WHERE EXISTS
(SELECT "Prixnet" FROM "tbl-tarifs" WHERE "tbl-articles"."reffrs" = "Reffrs")
@+
Dernière modification par martinbrait le 22 mai 2018 16:42, modifié 1 fois.
LibreOffice version 5.4.7.2.M6 (x64)
Windows 10
+
LibreOffice version 5.4.7.2.M6 (x64)
Windows 7

#HSQL Database Engine 1.8.0
version=1.8.0

Locale : fr-FR (fr_FR)

Obligation de version


Bonjour, merci et à bientôt !
Piaf
GourOOu
GourOOu
Messages : 5622
Inscription : 25 nov. 2011 18:07
Localisation : Guyane

Re: Update entre 2 tables

Message par Piaf »

Libre Office Version: 6.1.6 et Apache OpenOffice 4.1.6 Sur Xubuntu 18.04 AMD64
HRk2o
Membre cOOnverti
Membre cOOnverti
Messages : 344
Inscription : 29 mai 2009 08:51
Localisation : Guyane

Re: Update entre 2 tables

Message par HRk2o »

Re_ ,

j'avais déjà essayé les lignes mentionnées!

-> Martinbrait, cela retourne: Column not found "T_ARCHIVE" ou "T_DOSSIER" selon le cas;
-> Piaf, cela retourne : Single value expected

Code : Tout sélectionner

update "T_ARCHIVE" SET "REF_DOSSIER" = select "ID_DOSSIER" from "T_DOSSIER" where "NUMDOS" = "T_ARCHIVE"."REF_NUMDOS" AND "T_ARCHIVE"."ARCHIVE_LE" IS NOT NULL AND "T_ARCHIVE"."REF_DOSSIER" IS NULL WHERE EXISTS (select   "ID_DOSSIER" from "T_DOSSIER"  WHERE "T_ARCHIVE"."REF_NUMDOS" = "NUMDOS")
que je sois sous AOo ou LibreOffice 5.1.62

y' a un blème qq part et je vois pas où!
@+
AOO 4.1.14 et LO 7.3.7.2 sous OsX 10.13.6 High Sierra ; Windows 10 sous AOO 4.1.14 et LibO 7.3.7.2
Avatar de l’utilisateur
martinbrait
InconditiOOnnel
InconditiOOnnel
Messages : 753
Inscription : 09 avr. 2013 07:15
Localisation : T'as pas dit bonjour, merci et à bientot !

Re: Update entre 2 tables

Message par martinbrait »

Je n'ai pas su résoudre ça.

Je te propose, faute de mieux, de passer par une création de table,
puis réimportation du contenu dans la table de ton choix.
Il ne s'agit pas d'une mise à jour, mais d'une succession de 2 requêtes.
  • requête creation de table
  • requête insertion

Code : Tout sélectionner

SELECT "T_ARCHIVE"."ID_ARCHIVE", "T_ARCHIVE"."REF_NUMDOS", "T_ARCHIVE"."ARCHIVE_LE", "T_ARCHIVE"."REF_DOSSIER", "T_DOSSIER"."ID_DOSSIER", "T_DOSSIER"."NOM", "T_DOSSIER"."PRENOM", "T_DOSSIER"."DDN"
INTO import
FROM "T_DOSSIER", "T_ARCHIVE" WHERE "T_DOSSIER"."NUMDOS" = "T_ARCHIVE"."REF_NUMDOS"

'vide ensuite la structure de ton choix

'insère les enregistrements recoupés, depuis la table import

LibreOffice version 5.4.7.2.M6 (x64)
Windows 10
+
LibreOffice version 5.4.7.2.M6 (x64)
Windows 7

#HSQL Database Engine 1.8.0
version=1.8.0

Locale : fr-FR (fr_FR)

Obligation de version


Bonjour, merci et à bientôt !
HRk2o
Membre cOOnverti
Membre cOOnverti
Messages : 344
Inscription : 29 mai 2009 08:51
Localisation : Guyane

Re: Update entre 2 tables

Message par HRk2o »

Je te remercie!
J'espérai une solution Update... mais je me rends à l'évidence que ce n'est pas encore possible pour ce modèle.

la méthode que j'utilise , surtout lorsqu'il y a de nbrx colonnes, est d'exporter ttes les données assemblées ds un tableau , puis après manipulations de les réimporter ds la table idoine vierge.

C'est + long mais le résultat attendu est au rdv.

@+
AOO 4.1.14 et LO 7.3.7.2 sous OsX 10.13.6 High Sierra ; Windows 10 sous AOO 4.1.14 et LibO 7.3.7.2
Avatar de l’utilisateur
Hubert Lambert
SuppOOrter
SuppOOrter
Messages : 1214
Inscription : 06 avr. 2016 07:26

Re: Update entre 2 tables

Message par Hubert Lambert »

Bonjour,

Dans la table T_DOSSIER, le champ NUMDOS contient deux fois la référence 537, ce qui provoque le message d'erreur.
Ce doublon éliminé, la commande

Code : Tout sélectionner

UPDATE "T_ARCHIVE" SET "REF_DOSSIER" =
(SELECT "ID_DOSSIER" FROM "T_DOSSIER" WHERE "NUMDOS" = "T_ARCHIVE"."REF_NUMDOS")
WHERE EXISTS
(SELECT "ID_DOSSIER" FROM "T_DOSSIER" WHERE "NUMDOS" = "T_ARCHIVE"."REF_NUMDOS")
(adaptée du lien fourni par Piaf) fonctionne sans problème.
Cordialement.
AOOo 4.1.7 sur Win10
AOOo 4.1.x sur Linux Mint
LibreOffice 5.x/6.x sur Linux Mint
--
| « Nos défauts devraient nous donner une qualité : l'indulgence pour les défauts des autres » (Rivarol)
HRk2o
Membre cOOnverti
Membre cOOnverti
Messages : 344
Inscription : 29 mai 2009 08:51
Localisation : Guyane

Re: Update entre 2 tables

Message par HRk2o »

Bonsoir H Lambert,

eh bien, si je m'attendais à cette erreur de doublon!
Comme quoi, c'est utile de faire passer le problème par plusieurs mains.

Merci, merci!
Donc, résolu!
@+
AOO 4.1.14 et LO 7.3.7.2 sous OsX 10.13.6 High Sierra ; Windows 10 sous AOO 4.1.14 et LibO 7.3.7.2
HRk2o
Membre cOOnverti
Membre cOOnverti
Messages : 344
Inscription : 29 mai 2009 08:51
Localisation : Guyane

[Résolu]Re: Update entre 2 tables

Message par HRk2o »

HRk2o a écrit :Bonjour,
mes recherches sur la question mainte fois posée sur le forum ne m’ont pas permis de trouver la bonne solution à mon cas, malgré les adaptations effectuées.

Contexte :
Au départ, 2 fichiers de même structure., 2 tables = "T_DOSSIER" et "T_ARCHIVE" liée par "ID_DOSSIER" et "NUMDOS" dans un sous formulaire
Le fichier 1 (F1)= numéro impair et le fichier 2 (F2) = pair
Je fusionne F1 et F2 ainsi : (ex F2 vers F1)
copie de table "Dossier" F2 vers table "Dossier" F1 hors "ID_DOSSIER" F2 ;
copie de table "Archive" F2 vers table "Archive" F1 hors "REF_DOSSIER" F2 ;
J’obtiens donc dans F1 une suite continue de numéros impairs et pairs dans la table "T_DOSSIER" et dans la table "T_ARCHIVE".
Il me reste à mettre à jour dans la table "T_ARCHIVE" le champ" REF_DOSSIER" car vide, et qui doit correspondre par leur numéro pair au "ID_DOSSIER" de "T_DOSSIER" .

J’ai essayé :

Code : Tout sélectionner

update "T_ARCHIVE" SET "REF_DOSSIER" = select "ID_DOSSIER" from "T_DOSSIER" where "NUMDOS" = "T_ARCHIVE"."REF_NUMDOS" AND "T_ARCHIVE"."ARCHIVE_LE" IS NOT NULL AND "T_ARCHIVE"."REF_DOSSIER" IS NULL
cela me retourne : single value expected
je n’arrive pas à comprendre pourquoi !

Une idée !
update table .odb
AOO 4.1.14 et LO 7.3.7.2 sous OsX 10.13.6 High Sierra ; Windows 10 sous AOO 4.1.14 et LibO 7.3.7.2
Avatar de l’utilisateur
martinbrait
InconditiOOnnel
InconditiOOnnel
Messages : 753
Inscription : 09 avr. 2013 07:15
Localisation : T'as pas dit bonjour, merci et à bientot !

Re: [Résolu]Update entre 2 tables

Message par martinbrait »

Hello Hrk2o,
Je confirme la découverte du doublon, par Hubert LAMBERT

Code : Tout sélectionner

SELECT "NUMDOS",COUNT("NUMDOS")As "doublon" FROM "T_DOSSIER" 
group by "NUMDOS"
having COUNT("NUMDOS")>1
Après suppression du numéro de dossier 537, en double,
l'instruction passe sans difficulté :

Code : Tout sélectionner

UPDATE "T_ARCHIVE" SET "REF_DOSSIER" =
(SELECT "ID_DOSSIER" FROM "T_DOSSIER" WHERE "NUMDOS" = "T_ARCHIVE"."REF_NUMDOS")
WHERE EXISTS
(SELECT "ID_DOSSIER" FROM "T_DOSSIER" WHERE "NUMDOS" = "T_ARCHIVE"."REF_NUMDOS")
LibreOffice version 5.4.7.2.M6 (x64)
Windows 10
+
LibreOffice version 5.4.7.2.M6 (x64)
Windows 7

#HSQL Database Engine 1.8.0
version=1.8.0

Locale : fr-FR (fr_FR)

Obligation de version


Bonjour, merci et à bientôt !