根据过程调用中使用 SQL 或 PLSQL 的条件将数据合并/插入到现有表列中

问题描述 投票:0回答:1

团队, 需要使用一些逻辑根据同一个表的其他列更新现有的表列。

来源表如下:

价格表

BU_NAME VAL_STATUS  LOOPSETID
AAA             Y   0
BBB             Y   0
CCC             N   0
DDD             Y   0
EEE             Y   0
FFF             Y   0
GGG             Y   0

只需要选择

VAL_STATUS='Y
' 条记录,并将它们排序为每组最多 2 条记录,并更新列
LOOPSETID
,如下所示:

BU_NAME VAL_STATUS  LOOPSETID
AAA             Y   1
BBB             Y   1
CCC             N   0
DDD             Y   2
EEE             Y   2
FFF             Y   3
GGG             Y   3

我有以下针对该特定列值的查询 trunc((rowno + p_max_batch_rec - 1)/ p_max_batch_rec)loopsetid

其中 p_max_batch_rec 是当前设置为 2 的参数。该查询与源表列比较中插入其他目标表一起使用。

但现在我需要在源表本身中更新这个值。所以需要合并语句。

当我执行以下查询时遇到问题

MERGE INTO PRICELIST_SRC_TBL pt 
USING PRICELIST_SRC_TBL ps 
ON    (ps.VAL_STATUS = 'Y') 
WHEN matched THEN UPDATE 
SET pt.LOOPSETID = select trunc((rowno + 2 - 1) / 2) loopsetid from
(select ROW_NUMBER() OVER( ORDER BY val_status ) rowno from PRICELIST_SRC_TBL where VAL_STATUS = 'Y');

我得到的错误如下

Error starting at line : 1 in command -
MERGE INTO PRICELIST_SRC_TBL pt 
USING PRICELIST_SRC_TBL ps 
ON    (ps.VAL_STATUS = 'Y') 
WHEN matched THEN UPDATE 
SET pt.LOOPSETID = select trunc((rowno + 2 - 1) / 2) loopsetid from
(select ROW_NUMBER() OVER( ORDER BY val_status ) rowno from PRICELIST_SRC_TBL where VAL_STATUS = 'Y')
Error at Command Line : 5 Column : 20
Error report -
SQL Error: ORA-00936: missing expression
00936. 00000 -  "missing expression"
*Cause:    
*Action:
sql plsql merge
1个回答
0
投票

将该查询放在“USING”子句中,而不是放在 merge_update_clause 中。这有效:

MERGE INTO pricelist_src_tbl pt
USING (
   SELECT bu_name
         ,trunc((rowno + 2 - 1) / 2) loopsetid
     FROM ( SELECT bu_name
                  ,ROW_NUMBER()
                    OVER(
                     ORDER BY val_status
                    ) rowno
                   FROM pricelist_src_tbl
           WHERE val_status = 'Y'
          )
      ) ps ON ( ps.bu_name = pt.bu_name )
WHEN MATCHED THEN UPDATE
SET pt.loopsetid = ps.loopsetid;
© www.soinside.com 2019 - 2024. All rights reserved.