来自一列的 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 。 . .为什么MODELMODEL 列中有重复值?人们会期望链接列是唯一的。要解决重复的问题,您需要说明出现重复时该怎么办。【参考方案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 数据与来自另一列的匹配的主要内容,如果未能解决你的问题,请参考以下文章

Presto 数组包含来自另一列的值(超集 SQL 查询)

SQL SSMS CREATE TABLE 使用来自另一列的值

如果来自一列的数据存在于另一列中,则合并两个数据框

具有 1 个不同的列和来自另一列的总和值 [关闭]

根据来自另一列的不同值计算值

求sql语句!在同一表中,如何根据一列包含的内容,替换另一列的数据?