使用来自另一个 table 的值更新 table 中一列的所有记录

Updating all the record for a column in a table with value from another table

您好,我想用 TABLE_NAME_4MINS Table 的 RequestId 更新 IIL_CHANGE_REQUEST Table 的 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: single-row subquery returns more than one row

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

这取决于你想在这种情况下做什么。如果您真的不在乎,请取 任何 值,例如最小值:

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 条件,或者修复数据,或者……谁知道呢?我没有,而你应该。

您需要找到一个条件来将 returned 行缩小到每个 REQESTSTBY,例如您可以在下面的查询中将 ... 替换为列名return 只是第一行 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;