【问题标题】:How to multi-update the table in Oracle?如何在Oracle中多次更新表?
【发布时间】:2022-01-27 00:16:25
【问题描述】:

我有这些名为 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 表 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的错误

关于如何填充它的任何想法? 非常感谢!

【问题讨论】:

  • 您尝试使用结果集更新单个值:如果您是 DBMS,在这种情况下您会怎么做?
  • 啊!明白了……

标签: oracle merge insert


【解决方案1】:

正确的语法应该是

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_dimtransaction_line_fact 连接起来,但不要在子查询中再次指定该表,而是使用where 子句连接适当的列。


虽然现在就原则而言这是“OK”,但我无法判断它是否会(或不会)引发错误; too_many_rows 可能会再次发生,但是 - 在这种情况下 - 你必须决定如果相同的 kpi_dw_skey channel_dim 包含多行 - 你会只取一个(哪一个?),还是 . ..真的,说不出来。

【讨论】:

  • 谢谢伙计!它帮助...
  • 不客气。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-04
  • 2010-11-23
  • 2010-09-20
  • 1970-01-01
相关资源
最近更新 更多