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

Posted

技术标签:

【中文标题】SQL 更新一个表中的值以匹配 Oracle SQL Developer 中另一个表的值【英文标题】:SQL update values in one table to match values of another table in Oracle SQL Developer 【发布时间】:2015-10-30 11:21:02 【问题描述】:

我有两张桌子t1t2

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

我想更新t1name 列中的值以匹配t2name 列中的值。

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

我试过这样的:

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,所以我不能直接在Update内部使用Select

【问题讨论】:

请删除不涉及产品的标签。 【参考方案1】:

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

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 来获取信息,而不是更新值。

【讨论】:

据我所知,外键必须链接到另一个表中的唯一值(例如 ID),我在两个表中有多个具有相同名称和代码的条目,但它们具有不同的值在其他列中,所以我必须有多个具有相同代码的条目,因此我无法将它们与 fk 链接。我说的对吗?

以上是关于SQL 更新一个表中的值以匹配 Oracle SQL Developer 中另一个表的值的主要内容,如果未能解决你的问题,请参考以下文章

ORACLE SQL 查询从其他表中的行字符串匹配的行返回值

如何增加(更新)SQL 表中的单元格?在查询中

Oracle SQL - 重复行并更新表中的列

VBA Excel - 从 Excel 中的一个单元格中选择一个值以更新 SQL 表

在 Oracle SQL 中查询不返回单行时更新

Oracle SQL INNER Join 基于不匹配的值