2016-07-26 1 views
1

J'ai nom de la table merge_table comme:Comment mettre à jour ou copier des données entre les 2 tables SQL

Employee_Number MINISTRY_CODE BRANCH_SECRETARIAT_CODE 

    12     333     30 
    13     222     31 

Je veux copier la valeur de BRANCH_SECRETARIAT_CODE et le coller dans différentes table appelée EMPLOYMENTS ressembler à: et ENTITY_BRANCH a données nulles

EMPLOYEE_NUMBER JOINING_DATE  ENTITY_BRANCH 

    12    11/12/2006   null 
    13    01/11/2009   null 

donc, maintenant je veux copier la valeur de BRANCH_SECRETARIAT_CODE de table1 à table2 ENTITY_BRANCH pour chaque employé selon son EMPLOYEE_NUMBER

+1

Quel SGBD utilisez-vous? –

Répondre

2

Vous pouvez déclarer plusieurs tables dans votre instruction UPDATE et spécifier quelle colonne de quelle table doit être mise à jour à partir des valeurs de l'autre table.

Dans votre cas, vous avez seulement 2 tables de sorte que le plus facile est de faire un douaire de implict en utilisant T1.Employee_Number = T2.Employee_Number:

UPDATE Table1 T1, Table2 T2 
SET T2.ENTITY_BRANCH = T1.BRANCH_SECRETARIAT_CODE 
WHERE T1.Employee_Number = T2.Employee_Number 

Je devinais c'est pour le serveur SQL mais cette instruction UPDATE fonctionnera également sur MySQL et Access. Veuillez modifier votre question pour ajouter le tag RDBMS approprié.

+1

Je suis sceptique à ce sujet étant ANSI SQL, donc je suppose que ce n'est pas ce que vous vouliez dire par "cette instruction UPDATE fonctionnera sur n'importe quel SGBDR". Quoi qu'il en soit, je préfère utiliser 'merge' dans les cas comme celui-ci: je sais que c'est ANSI, et cela permet d'utiliser des' join's entre la source et la destination (et parmi les sources multi-tables). –

+0

@a_horse_with_no_name Où avez-vous lu que c'est la norme Ansi? J'ai précisé qu'il devrait fonctionner sur n'importe quel SGBDR, mais en fait j'aurais dû dire "la plupart d'entre eux" à la place. Il fonctionne sur Oracle, SQL Server, Access, MySQL, et bien d'autres. Adaptation de toute façon. –

+1

Cela ne fonctionne pas avec le "plus" des SGBD. Il ne fonctionne pas avec Oracle, Postgres, DB2, Firebird, SAP HANA, HSQLDB, H2, Apache Derby, Informix, Vertica. –

1

Utilisez le merge statement Standard ANSI, ce qui permet une meilleure join syntaxe pour faire correspondre les tables de style de source et de destination, prend en charge les clauses de sources complexes, soutient insert s aussi, etc.

merge into EMPLOYMENTS -- destination table 
using Merge_table  -- source table, or nested subquery, CTE, etc. 
on Merge_table Employee_Number = EMPLOYMENTS.EMPLOYEE_NUMBER 
    -- any other criteria to determine which destination rows to affect 
    -- e.g.: and EMPLOYMENTS.EMPLOYEE_NUMBER is null 
-- when not matched then 
--  [...] 
when matched then 
    update 
    set EMPLOYMENTS.ENTITY_BRANCH = Merge_table.BRANCH_SECRETARIAT_CODE; 
+0

J'essaie alors j'ai eu cette erreur ORA-00969: mot-clé ON manquant – ghalib

+0

Alors éditez votre question pour marquer ce que vous utilisez, sans doute conforme à la norme ANSI, SGBD. Sinon, les gens devinent dans le noir - ce qui est inutile. Mais étant donné que vous avez seulement étiqueté 'sql', nous sommes tout à fait dans notre droit de supposer que vous voulez une solution standardisée hypothétique, quel que soit le nombre de SGBD qui se fient à la conformité. Le vôtre est probablement ORAcle. Je ne sais pas de quoi il se plaint: il y a un «on» juste là. L'avez-vous exécuté tel quel? Peut-être supprimer les commentaires. Je ne sais pas. Le SGBD d'Oracle n'a-t-il pas vraiment de meilleurs messages d'erreur? Un numéro de ligne serait-il trop demander? –