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 【问题描述】:我有两张桌子t1
和t2
:
t1 t2
------------- -------------
NAME | CODE NAME | CODE
------------- -------------
ABC | 1651 KKK | 127
CDE | 127 KKK | 127
SKND | 127 AAA | 66
BBB | 1651
我想更新t1
中name
列中的值以匹配t2
中name
列中的值。
在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 行,因为t1
或t2
中的代码都不是唯一的。
我一直在寻找所有问题,但所有问题在他们想要的值的表中只有唯一值。
我认为我离解决方案还很远,我对 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 查询从其他表中的行字符串匹配的行返回值