如何使用其他表中的数据一次更新具有空值的表?

时间:2009-11-23 06:23:29

标签: oracle oracle10g

我有2张桌子 - A和B.表A有两列,pkey(主键)和col1。表B还有两列pr_key(主键但不是外键)和column1。两个表都有4行。表B在column1中没有值,而表A在所有4行中都有column1个值。所以我的数据看起来像这样

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

我想更新表B,将每行的column1值设置为等于单个DML语句中表A中等效行的column1值。

3 个答案:

答案 0 :(得分:2)

应该是这样的(取决于你使用的SQL实现,但一般来说,以下是相当标准的。特别是应该在MS-SQL和MySQL中工作。

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)

关于tblB的pr_key的性质,问题有点不清楚,如果由于某种原因这是该表的默认/自动递增的键,那么它可以从列列表(括号中)和在随后的SELECT中。以这种方式插入每个新行时,将生成一个新值。

编辑:看来OP实际上想要用来自A的值更新表B. 这个语法应该类似于

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

答案 1 :(得分:1)

这可能表现更好:

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;

答案 2 :(得分:0)

听起来您想要进行相关更新。 Oracle中的语法是

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 )

如果WHERE EXISTStableA各有4行且每组中都有相同的键组,则不需要tableB子句。但是,如果column1中没有匹配的行,则包含该选项会更安全,以避免将tableB的{​​{1}}值更新为NULL