2016-09-27 82 views
1

在表中的列值从另一个表我需要更新表t1与来自表t2 NEW_ID列old_id列值,其中old_id被表t2匹配更新在Oracle

T1

old_id name desc 
----------------------- 
1  a  abc 
2  b  def 
3  c  adf 
null d  ghi 

T2

new_id old_id code 
---------------------- 
x  1  ab 
y  2  cd 
z  3  gh 

我的输出应该像

T1

old_id name desc 
----------------------- 
x  a  abc 
y  b  def 
z  c  adf 
null d  ghi 
+2

呃,我没有看到表3中匹配的id。 –

+0

如何更新id = 3的行?这是一个错字吗?如果是这样,请编辑该问题,否则请解释您需要的逻辑 – Aleksej

+0

对不起,这是一个错字。现在更正。 – Chris

回答

0

尝试使用

update t1 set t1.old_id=(select min(t2.new_id) from t2 where t2.old_id=t1.old_id) 

update t1 set t1.old_id=(select max(t2.new_id) from t2 where t2.old_id=t1.old_id) 

要查看将使用此查询

select t1.*, (select max(t2.new_id) from t2 where t2.old_id=t1=old_id) as futureIdvalue from t1  
+0

我收到一个错误,提示“第2行出现错误: ORA-01427:单行子查询返回多行” – Chris

+0

这是因为您在t2中对同一个old_id有更多的一个值。现在重试...当我们做min(t2.new_id)时,回答被修改为 – Christian

+0

不会我们更新所有记录只有一个最小值? – Chris

-1
UPDATE 
T1 
SET 
T1.old_id= T2.new_id 
FROM 
T1, 
T2 
WHERE 
T1.old_id= T2.old_id; 
+0

为什么我在此处得到否定的答案? –

+1

可能因为这既不是有效的标准SQL,也不适用于Oracle。 –

0

上做出的第变化e开头几个假设:

  1. 我认为没有在T2表中的问题类型和第三纪录old_id = 3
  2. 因为你有Desc列,什么是Oracle我的保留字我将所有列视为带引号的标识符。

这是我的代码(最后更新语句)。

CREATE TABLE T1 
    ("old_id" VARCHAR2(50), 
    "name" VARCHAR2(50), 
    "desc" VARCHAR2(50) 
); 
/
CREATE TABLE T2 
    (
    "new_id" VARCHAR2(50), 
    "old_id" VARCHAR2(50), 
    "code" VARCHAR2(50) 
); 
/

INSERT INTO T1 VALUES('1', 'a', 'abc'); 
INSERT INTO T1 VALUES('2', 'b', 'def'); 
INSERT INTO T1 VALUES('3', 'c', 'adf'); 
INSERT INTO T1 VALUES(NULL, 'd', 'ghi'); 

INSERT INTO T2 VALUES('x', '1', 'ab'); 
INSERT INTO T2 VALUES('y', '2', 'cd'); 
INSERT INTO T2 VALUES('z', '3', 'gh'); 

UPDATE t1 
    SET "old_id" = (SELECT "new_id" 
        FROM t2 
        WHERE t1."old_id" = t2."old_id");