来自一列的 SQL UPDATE 数据与来自另一列的匹配
Posted
技术标签:
【中文标题】来自一列的 SQL UPDATE 数据与来自另一列的匹配【英文标题】:SQL UPDATE data from one column with a match from another column 【发布时间】:2018-06-08 14:40:49 【问题描述】:我有两个 SQL 表 - 一个表 MODEL 只有三列,另一个是我的 MASTER 表,其中包含所有数据。我在 MASTER 表中添加了一个新列 (MODEL_LONG)。我现在需要使用 MODEL 表中的数据更新该新列。
MODEL 表只有大约 40 条记录。第一列是 MODEL 列,另外两列是 MODEL_SHORT(模型的缩写名称)和 MODEL_LONG(完整的模型名称)。
我需要填充刚刚添加到 MASTER 表中的新 MODEL_LONG 列。我需要检查 MASTER TABLE 的每条记录中的 MODEL 名称是什么,并使用 MODEL 表中相应的 MODEL_LONG 名称更新 MASTER 表上的 MODEL_LONG 列。
以下内容不起作用(在 Oracle SQL Developer 中)。我在这里错过了什么?
UPDATE MASTER
SET MASTER.MODEL_LONG = MODEL.MODEL_LONG
FROM MASTER JOIN MODEL
ON MASTER.MODEL = MODEL.MODEL;
【问题讨论】:
这个问题被问过很多次了:***.com/questions/2446764/… 有趣的是,我从这里得到了我的 UPDATE 查询 - ***.com/questions/5036918/… 【参考方案1】:Oracle 不支持UPDATE
中的FROM
子句。一种方法使用相关子查询:
UPDATE MASTER
SET MASTER.MODEL_LONG = (SELECT MODEL.MODEL_LONG
FROM MODEL
WHERE MASTER.MODEL = MODEL.MODEL
);
这将更新所有行。那些没有匹配的人得到NULL
。为了防止这种情况:
UPDATE MASTER
SET MASTER.MODEL_LONG = (SELECT MODEL.MODEL_LONG
FROM MODEL
WHERE MASTER.MODEL = MODEL.MODEL
)
WHERE EXISTS (SELECT MODEL.MODEL_LONG
FROM MODEL
WHERE MASTER.MODEL = MODEL.MODEL
);
【讨论】:
我使用的是这里的查询(第一个答案),但我猜这是特定于 SQL Server 的? ***.com/questions/5036918/… 使用此查询出现此错误 - SQL 错误:ORA-01427:单行子查询返回多行 01427。00000 -“单行子查询返回多行” @BigRedEO 。 . .为什么MODEL
在MODEL
列中有重复值?人们会期望链接列是唯一的。要解决重复的问题,您需要说明出现重复时该怎么办。【参考方案2】:
您可以使用 Merge 语句来更新 MASTER TABLE
MERGE INTO MASTER
USING (SELECT * FROM MODEL) MODEL
ON (MASTER.MODEL = MODEL.MODEL)
WHEN MATCHED THEN UPDATE
SET MASTER.MODEL_LONG = MODEL.MODEL_LONG;
尝试在内部查询中使用 distinct
关键字,因为 ORA-30926
错误意味着您的源表包含重复的 ID/记录。
只是把 distinct 看看它是否有帮助。
select distinct * from MODEL;
【讨论】:
此版本出现以下错误 - SQL 错误:ORA-30926:无法在源表中获得稳定的行集 30926. 00000 -“无法在源表中获得稳定的行集源表” *原因:由于大量 dml 活动或不确定的 where 子句,无法获得一组稳定的行。 *行动:删除任何非确定性 where 子句并重新发布 dml【参考方案3】:如果您的表有适当的唯一键,您可以使用这个:
UPDATE
(SELECT
MASTER.MODEL_LONG as MASTER_MODEL_LONG,
MODEL.MODEL_LONG as MODEL_MODEL_LONG
FROM MASTER JOIN MODEL ON MASTER.MODEL = MODEL.MODEL)
SET MASTER_MODEL_LONG = MODEL_MODEL_LONG;
【讨论】:
我创建了 MASTER 表,但其他人创建了 MODEL 表。我开始怀疑他们在创建列名时可能在列名周围使用了引号,这可能是无论我尝试哪种 UPDATE 语句都会出现错误的原因。以上是关于来自一列的 SQL UPDATE 数据与来自另一列的匹配的主要内容,如果未能解决你的问题,请参考以下文章