如何在 Oracle 中多次更新 table?
How to multi-update the table in Oracle?
我有这些 table 叫做 transaction_line_fact 和 channel_dim:
SQL> desc transaction_line_fact
Name Null? Type
----------------------------------------------------------------- -------- --------------------------------------------
TRANSACTION_ID NUMBER(20)
TRANSACTION_LINE_ID NUMBER(20)
TRANID VARCHAR2(30)
TRANSACTION_TYPE VARCHAR2(50)
TRANDATE DATE
KPI_CHANNEL_SKEY NUMBER(20)
KPI_LOCATION_SKEY NUMBER(20)
KPI_DEPARTMENT_SKEY NUMBER(20)
KPI_ITEM_SKEY NUMBER(20)
AMOUNT NUMBER(8,2)
COST NUMBER(8,2)
UNITS NUMBER(5)
KPI_DW_SKEY NOT NULL NUMBER(20)
SQL> desc channel_dim
Name Null? Type
----------------------------------------------------------------- -------- --------------------------------------------
DATE_CREATED DATE
IS_RECORD_INACTIVE CHAR(1)
LAST_MODIFIED_DATE DATE
LIST_ID NUMBER(20)
LIST_ITEM_NAME VARCHAR2(20)
KPI_DW_SKEY NOT NULL NUMBER(20)
KPI_DW_INSERT_DATE DATE
KPI_DW_UPDATE_DATE DATE
目前 transaction_line_fact table KPI_CHANNEL_SKEY
中包含空值,但我想借助 channel_dim 中的 KPI_DW_SKEY
列来填充它。
我也试过这样做:
SQL> update transaction_line_fact set kpi_channel_skey = (select c.kpi_dw_skey from channel_dim c join transaction_line_fact t on c.kpi_dw_skey=t.kpi_dw_skey);
update transaction_line_fact set kpi_channel_skey = (select c.kpi_dw_skey from channel_dim c join transaction_line_fact t on c.kpi_dw_skey=t.kpi_dw_skey)
*
ERROR at line 1:
ORA-01427: single-row subquery returns more than one row
SQL> update transaction_line_fact set kpi_channel_skey = (select kpi_dw_skey from channel_dim) where kpi_channel_skey is null;
update transaction_line_fact set kpi_channel_skey = (select kpi_dw_skey from channel_dim) where kpi_channel_skey is null
*
ERROR at line 1:
ORA-01427: single-row subquery returns more than one row
SQL> update transaction_line_fact set kpi_channel_skey in (select kpi_dw_skey from channel_dim) where kpi_channel_skey is null;
update transaction_line_fact set kpi_channel_skey in (select kpi_dw_skey from channel_dim) where kpi_channel_skey is null
*
ERROR at line 1:
ORA-00927: missing equal sign
但它再次显示错误 ORA-01427: single-row subquery returns more than one row
知道如何填充它吗?
非常感谢!
正确的语法是
UPDATE transaction_line_fact f
SET f.kpi_channel_skey =
(SELECT c.kpi_dw_skey
FROM channel_dim c
WHERE c.kpi_dw_skey = f.kpi_dw_skey);
换句话说,您必须将 channel_dim
与 transaction_line_fact
连接起来,但不要在子查询中再次指定 table,而是使用 where
子句来加入适当的列。
虽然现在就原理而言这已经“OK”了,但我不知道它是否会(或不会)引发错误; too_many_rows
可能会再次发生,但是 - 在那种情况下 - 如果相同的 kpi_dw_skey
channel_dim
包含多个行,你必须决定要做什么 - 你会只取一个(哪个一个?),或者……真的,说不出来。
我有这些 table 叫做 transaction_line_fact 和 channel_dim:
SQL> desc transaction_line_fact
Name Null? Type
----------------------------------------------------------------- -------- --------------------------------------------
TRANSACTION_ID NUMBER(20)
TRANSACTION_LINE_ID NUMBER(20)
TRANID VARCHAR2(30)
TRANSACTION_TYPE VARCHAR2(50)
TRANDATE DATE
KPI_CHANNEL_SKEY NUMBER(20)
KPI_LOCATION_SKEY NUMBER(20)
KPI_DEPARTMENT_SKEY NUMBER(20)
KPI_ITEM_SKEY NUMBER(20)
AMOUNT NUMBER(8,2)
COST NUMBER(8,2)
UNITS NUMBER(5)
KPI_DW_SKEY NOT NULL NUMBER(20)
SQL> desc channel_dim
Name Null? Type
----------------------------------------------------------------- -------- --------------------------------------------
DATE_CREATED DATE
IS_RECORD_INACTIVE CHAR(1)
LAST_MODIFIED_DATE DATE
LIST_ID NUMBER(20)
LIST_ITEM_NAME VARCHAR2(20)
KPI_DW_SKEY NOT NULL NUMBER(20)
KPI_DW_INSERT_DATE DATE
KPI_DW_UPDATE_DATE DATE
目前 transaction_line_fact table KPI_CHANNEL_SKEY
中包含空值,但我想借助 channel_dim 中的 KPI_DW_SKEY
列来填充它。
我也试过这样做:
SQL> update transaction_line_fact set kpi_channel_skey = (select c.kpi_dw_skey from channel_dim c join transaction_line_fact t on c.kpi_dw_skey=t.kpi_dw_skey);
update transaction_line_fact set kpi_channel_skey = (select c.kpi_dw_skey from channel_dim c join transaction_line_fact t on c.kpi_dw_skey=t.kpi_dw_skey)
*
ERROR at line 1:
ORA-01427: single-row subquery returns more than one row
SQL> update transaction_line_fact set kpi_channel_skey = (select kpi_dw_skey from channel_dim) where kpi_channel_skey is null;
update transaction_line_fact set kpi_channel_skey = (select kpi_dw_skey from channel_dim) where kpi_channel_skey is null
*
ERROR at line 1:
ORA-01427: single-row subquery returns more than one row
SQL> update transaction_line_fact set kpi_channel_skey in (select kpi_dw_skey from channel_dim) where kpi_channel_skey is null;
update transaction_line_fact set kpi_channel_skey in (select kpi_dw_skey from channel_dim) where kpi_channel_skey is null
*
ERROR at line 1:
ORA-00927: missing equal sign
但它再次显示错误 ORA-01427: single-row subquery returns more than one row
知道如何填充它吗? 非常感谢!
正确的语法是
UPDATE transaction_line_fact f
SET f.kpi_channel_skey =
(SELECT c.kpi_dw_skey
FROM channel_dim c
WHERE c.kpi_dw_skey = f.kpi_dw_skey);
换句话说,您必须将 channel_dim
与 transaction_line_fact
连接起来,但不要在子查询中再次指定 table,而是使用 where
子句来加入适当的列。
虽然现在就原理而言这已经“OK”了,但我不知道它是否会(或不会)引发错误; too_many_rows
可能会再次发生,但是 - 在那种情况下 - 如果相同的 kpi_dw_skey
channel_dim
包含多个行,你必须决定要做什么 - 你会只取一个(哪个一个?),或者……真的,说不出来。