2009-11-23 5 views
1

J'ai 2 tables - A et B. Le tableau A comporte deux colonnes, pkey (clé primaire) et col1. Le tableau B comporte également deux colonnes, pr_key (clé primaire mais pas une clé étrangère) et column1. Les deux tables ont 4 lignes. Le tableau B n'a aucune valeur dans column1, tandis que le tableau A contient column1 pour les 4 lignes. Donc, mes données ressemble à ceciComment mettre à jour une table avec des valeurs nulles avec des données de l'autre table en même temps?

Table A 
pkey col1 
A 10 
B 20 
C 30 
D 40 

Table B 
pr_key column1 
A  null 
B  null 
C  null 
D  null 

Je veux mettre à jour le tableau B pour définir la valeur column1 de chaque ligne égale à la valeur column1 de la ligne équivalente de la table A dans une seule instruction DML.

+0

Qu'est-ce que DB utilisez-vous? –

+0

oracle 10 g base de données –

Répondre

2

devrait être quelque chose comme ça (dépend de la mise en œuvre de SQL que vous utilisez, mais en général, ce qui suit est plutôt standard. En particulier

INSERT INTO tblB (pr_key, column1) 
    SELECT pkey, col1 
    FROM tblA 
    -- WHERE some condition (if you don't want 100% of A to be copied) 

devrait fonctionner dans MS-SQL et MySQL. La question est peu clair quant à la nature de la clé pr_key de tblB, si pour une raison quelconque il s'agissait d'une clé par défaut/auto-incrémentée pour cette table, elle pourrait alors être omise de la liste des colonnes (entre parenthèses) et du SELECT qui suit. de cette façon, lors de l'insertion de chaque nouvelle ligne, une nouvelle valeur serait générée

Modifier: Il semble que le OP veut réellement mettre à jour le tableau B avec les valeurs de A. La syntaxe de cela devrait alors être quelque chose comme

UPDATE tblB 
SET Column1 = A.Col1 
FROM tblA AS A 
JOIN tblB AS B ON B.pr_key = A.pkey 
+0

Ok, je suis désolé. Puisque pr_key de la table B est une clé primaire, les valeurs nulles ne peuvent pas être insérées dans la table B. Donc, les valeurs de pr_key sont les mêmes que pkey colonne du tableau A. Table A a été arbitrairement peuplé de 4 lignes. –

+0

Tableau A pkey col1 A 10 B 20 \t C 30 D 40 Tableau B pr_key column1 A null B null C null D null Je veux updaet tableau B avec col1 de la table A en une fois. –

+0

@Anupam Ray, cochez la case où j'ai ajouté la syntaxe UPDATE. (Pas 100% sûr que c'est ok avec Oracle 10g [maintenant que vous l'avez spécifié], mais encore une fois, devrait être sacrément proche, vérifiez les docs d'Oracle) – mjv

0

On dirait que vous voulez faire une mise à jour corrélative. La syntaxe pour que Oracle est

UPDATE tableB b 
    SET column1 = (SELECT a.column1 
        FROM tableA a 
        WHERE a.pkey = b.pr_key) 
WHERE EXISTS(SELECT 1 
       FROM tableA a 
       WHERE a.pkey = b.pr_key) 

La clause WHERE EXISTS est pas nécessaire si tableA et tableB ont chacun 4 rangs et ont le même ensemble de touches chacune. Il est toutefois beaucoup plus sûr d'inclure cette option pour éviter de mettre à jour les valeurs column1 de tableB à NULL s'il n'y a pas de ligne correspondante dans tableA.

1

Cela peut travailler mieux

MERGE INTO tableB 
USING (select pkey, col1 from tableA) a 
ON (tableB.pr_key = a.pkey) 
WHEN MATCHED THEN UPDATE 
SET tableB.column1 = a.col1; 
+0

Ceci est étiqueté pour 10g.10g n'exigeait-il pas qu'une instruction 'MERGE' ait une section' WHEN NOT MATCHED'? Je pensais que c'était seulement 11g qui a fait cette option –

+0

Non, c'est facultatif dans 10g aussi bien. –

Questions connexes