SQL更新一个表中的值以匹配Oracle SQL Developer中另一个表的值

时间:2015-10-30 11:21:02

标签: sql oracle sql-update

我有两张表t1t2

  t1                       t2
 -------------            ------------- 
  NAME | CODE              NAME | CODE
 -------------            -------------
   ABC | 1651               KKK |  127 
   CDE |  127               KKK |  127 
  SKND |  127               AAA |   66 
                            BBB | 1651

我想更新name中的t1列中的值,以匹配namet2列中的值。

t1中,code值可以有不同的name值,但在t2中,一个code始终具有相同的name,但是还有更多行具有相同的code,因为t2有其他不同的列。

我试过这样的事情:

UPDATE t1
SET t1.NAME = 
  (
    select t2.NAME 
    from t2
    inner join t1
    on t1.CODE = cast(t2.CODE as varchar2(128))
  ) 
where t1.CODE in ( select t2.CODE from t2 );

问题是,设置t1.NAME的选择只会返回1行,因为t1t2中的代码都不是唯一的。

我一直在寻找所有问题,但所有问题在他们想要的价值表中只有唯一的值。

我认为我离解决方案还很远,我对SQL很陌生。

基本上我希望t1看起来像这样:

-------------
 NAME | CODE
-------------
  BBB | 1651
  KKK | 127
  KKK | 127

我使用Oracle SQL Developer,因此我无法在Select内直接使用Update

1 个答案:

答案 0 :(得分:2)

我认为你想要一个相关的子查询:

UPDATE t1
    SET t1.NAME = (select t2.NAME 
                   from t2
                   where t1.CODE = cast(t2.CODE as varchar2(128))
                  ) 
    where t1.CODE in (select t2.CODE from t2);

如果您仍然遇到重复问题,可以将and rownum = 1添加到子查询中,或将其select改为select max(t2.name)

注意:您可能只需要在表之间建立正确的外键关系,并在查询表时使用join来获取信息,而不是更新值。