什么 ORACLE 更新 SQL 查询呢?

Posted

技术标签:

【中文标题】什么 ORACLE 更新 SQL 查询呢?【英文标题】:What ORACLE Update SQL Query for this? 【发布时间】:2018-11-19 04:13:52 【问题描述】:

我想将RENEWED_PERMIT_TEMP 的值更新为T2_VAL

想到merge into,但我不习惯ORACLE DB

选择 t1.INSTANCE_ID ,t1.RENEWED_PERMIT_TEMP ,t1.USER_REFERENCE_NUMBER 作为 t1_val ,t2.USER_REFERENCE_NUMBER 作为 t2_val ,t2.PREV_CERTIFICATE_PERMIT_NUMBER ,t1.APPROVAL_REFERENCE FROM LCS_GEN_COPY AS t1 INNER JOIN LCS_GEN_COPY AS t2 ON t2.PREV_CERTIFICATE_PERMIT_NUMBER = t1.APPROVAL_REFERENCE 和 t1.RENEWED_PERMIT_TEMP = t1.USER_REFERENCE_NUMBER

Data from that query

【问题讨论】:

【参考方案1】:

我们可以尝试使用相关子查询:

UPDATE LCS_GEN_COPY t1
SET RENEWED_PERMIT_TEMP = (SELECT DISTINCT t2.USER_REFERENCE_NUMBER
                           FROM LCS_GEN_COPY t2
                           WHERE t2.PREV_CERTIFICATE_PERMIT_NUMBER =
                                     t1.APPROVAL_REFERENCE AND t1.RENEWED_PERMIT_TEMP =
                                     t1.USER_REFERENCE_NUMBER);

【讨论】:

[21000][1427] ORA-01427:单行子查询返回多于一行。我上面的选择语句获取了我需要更新的所有值 那么你的要求是没有意义的。在子查询中尝试SELECT DISTINCT。如果这不起作用,那么您需要为我们提供从许多可能的更新值中进行选择的逻辑。 因为我上面的查询是我必须交换值的所有数据。是否可以从该选择查询中更新数据? 您的评论毫无意义。问题是您的查询有时有多个 USER_REFERENCE_NUMBER 可以从中更新一个 RENEWED_PERMIT_TEMP 值。【参考方案2】:

你可以试试下面

UPDATE 
(SELECT t1.INSTANCE_ID
      ,t1.RENEWED_PERMIT_TEMP
      ,t1.USER_REFERENCE_NUMBER AS t1_val
      ,t2.USER_REFERENCE_NUMBER AS t2_val
      ,t2.PREV_CERTIFICATE_PERMIT_NUMBER
      ,t1.APPROVAL_REFERENCE
FROM LCS_GEN_COPY AS t1
INNER JOIN LCS_GEN_COPY AS t2 ON t2.PREV_CERTIFICATE_PERMIT_NUMBER = t1.APPROVAL_REFERENCE
AND t1.RENEWED_PERMIT_TEMP  = t1.USER_REFERENCE_NUMBER
) t
SET t.RENEWED_PERMIT_TEMP = t.t2_val

【讨论】:

以上是关于什么 ORACLE 更新 SQL 查询呢?的主要内容,如果未能解决你的问题,请参考以下文章

SQL - 从复杂查询更新 Oracle 10g 数据库

为啥 oracle 不支持在单个查询中更新多个表?

Oracle SQL 更新基于两个表之间的子查询

如何使用 ORACLE(OCI) 在 SQL/PHP 中进行更新查询

Oracle SQL 更新查询需要几天时间才能更新

如何通过 sql 查询在 Oracle 中更新类型为 TIMESTAMP 的列?