【问题标题】:Updating all the record for a column in a table with value from another table使用另一个表中的值更新表中列的所有记录
【发布时间】:2021-07-27 03:08:30
【问题描述】:

您好,我想用 TABLE_NAME_4MINS 表的 RequestId 更新 IIL_CHANGE_REQUEST 表的 RequestId 列的所有值,其中两个表中的 REQUESTBY 列相同。我正在尝试在 oracle daatabalse(sql developer) 中执行此操作

我的查询:

Update IIL_CHANGE_REQUEST 
set REQUESTID=(SELECT TABLE_NAME_4MINS.REQUESTID
                     FROM TABLE_NAME_4MINS
                     WHERE IIL_CHANGE_REQUEST.REQUESTBY = TABLE_NAME_4MINS.REQUESTBY) 
WHERE EXISTS (SELECT TABLE_NAME_4MINS.REQUESTID
                     FROM TABLE_NAME_4MINS
                     WHERE IIL_CHANGE_REQUEST.REQUESTBY = TABLE_NAME_4MINS.REQUESTBY)

但每次我这样做时都会收到一条错误消息:

Error starting at line : 1 in command -
Update IIL_CHANGE_REQUEST 
set REQUESTID=(SELECT TABLE_NAME_4MINS.REQUESTID
                     FROM TABLE_NAME_4MINS
                     WHERE IIL_CHANGE_REQUEST.REQUESTBY = TABLE_NAME_4MINS.REQUESTBY) 
WHERE EXISTS (SELECT TABLE_NAME_4MINS.REQUESTID
                     FROM TABLE_NAME_4MINS
                     WHERE IIL_CHANGE_REQUEST.REQUESTBY = TABLE_NAME_4MINS.REQUESTBY)

错误报告-

ORA-01427: 单行子查询返回多于一行

请任何人帮助我该怎么做。

【问题讨论】:

  • 单行子查询返回多行——这句话有什么不清楚的地方?

标签: sql oracle oracle11g oracle-sqldeveloper


【解决方案1】:

您需要找到一个条件来将返回的行缩小到每个REQESTSTBY 的唯一行,例如,您可以在下面的查询中将... 替换为列名,以便根据order-by 仅返回第一行:

MERGE INTO IIL_CHANGE_REQUEST r
USING (
        SELECT *
        FROM (
           SELECT REQUESTBY, REQUESTID
                ,row_number()over(partition by REQUESTBY order by ...) rn
           FROM TABLE_NAME_4MINS
        ) 
        where rn=1
        ) t
ON (r.REQUESTBY = t.REQUESTBY)
WHEN MATCHED THEN UPDATE
   set REQUESTID=t.REQUESTID;

【讨论】:

  • 非常感谢,我没有意识到可能有多种情况 REQUESTBY 相同,这就是我收到错误的原因。
【解决方案2】:

这取决于您在这种情况下要做什么。如果您不关心,请取 any 值,例如 minimum:

update iil_change_request a
set a.requestid = (select min(b.requestid)            --> here
                   from table_name_4mins b
                   where a.requestby = b.requestby) 
where exists (select c.requestid
              from table_name_4mins c
              where a.requestby = c.requestby);

如果这不是您想要的,那么您将不得不弄清楚如何处理这些“重复”。也许您必须包含另一个WHERE 条件,或者修复数据,或者......谁知道呢?我不知道,而你应该这样做。

【讨论】:

  • 非常感谢,我没有意识到可能有多种情况 REQUESTBY 相同,这就是我收到错误的原因。现在我知道该做什么了。
猜你喜欢
  • 1970-01-01
  • 2021-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-26
相关资源
最近更新 更多