使用来自另一个 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;
您好,我想用 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;