2009-11-23 48 views
1

我有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设置每行等于一个DML语句从表A中的column1值相当于行的column1值。

+0

DB什么您使用的是? – 2009-11-23 06:28:29

+0

oracle 10g数据库 – 2009-11-23 06:37:33

回答

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 
+0

好的,我很抱歉。由于表B的pr_key是主键,所以空值不能插入到表B中。因此,pr_key的值与表A的pkey列相同。表A已经随意填充4行。 – 2009-11-23 06:40:18

+0

表A PKEY COL1 B 20 \t -C 30 d 40 表B pr_key COLUMN1 空 乙空 C语言的零 d空 欲updaet表B与表A的col1在一起。 – 2009-11-23 06:44:20

+0

@Anupam Ray,检查编辑我添加UPDATE语法的地方。 (不是100%确定这与Oracle 10g [现在您指定了它]是一致的,但是应该该死的,请检查Oracle的文档) – mjv 2009-11-23 07:35:11

0

这听起来像你想做一个相关的更新。对于在甲骨文的语法是

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 EXISTS子句不是必要的,如果tableAtableB各自具有4行具有相同的一组中的每个键。但是,包含该选项要安全得多,以避免在tableA中没有匹配的行时将tableB的值更新为NULL

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; 
+0

它被标记为10g。没有10g要求'MERGE'语句有'WHEN NOT MATCHED'部分?我认为它只有11g可选 – 2012-08-30 01:45:57

+0

不,它在10g中也是可选的。 – 2012-08-30 01:50:53

相关问题