在Oracle中,我正在尝试使用自身和另一个模式/表中的1个值来更新值。以下是我到目前为止所尝试的无济于事。
UPDATE DEV02I2B2DEMODATA.partition_obs_2
SET COUNT = SUM(COUNT+CPT_COUNT)
WHERE prefix IN (SELECT concept_cd FROM
PCORI_ETL_WEIGHT2.CONCEPT_COUNT_OBS_FACT_17Q1);
UPDATE
(SELECT * FROM t1.partition_obs_2 D
JOIN t2.CONCEPT_COUNT_OBS_FACT_17Q1 P ON D.PREFIX = P.CONCEPT_CD
) D
SET D.COUNT = SUM(D.COUNT+P.CPT_COUNT)
每次我收到错误'ORA-00934:此处不允许群组功能'我不知道如何继续
两个表都包含2列
CREATE TABLE "DEV02I2B2DEMODATA"."PARTITION_OBS_2"
( "PREFIX" VARCHAR2(500 BYTE),
"COUNT" NUMBER)
CREATE TABLE "PCORI_ETL_WEIGHT2"."CONCEPT_COUNT_OBS_FACT_17Q1"
( "CPT_COUNT" NUMBER,
"CONCEPT_CD" VARCHAR2(50 BYTE))
一些示例数据,除了标题之外,两个表都是这样的。
PREFIX COUNT
CPT:000 2077
CPT:001 90169
CPT:002 2626
我正在尝试将每个前缀的两个表中的count列相加并更新DEV02I2B2DEMODATA.PARTITION_OBS_2中的count列
任何建议都将不胜感激
谢谢, 艾伦
答案 0 :(得分:0)
只需将SET部分转换为子查询。
UPDATE t1.partition_obs_2 A
SET A.COUNT = (SELECT SUM(D.COUNT+P.CPT_COUNT) FROM t1.partition_obs_2 D
JOIN t2.CONCEPT_COUNT_OBS_FACT_17Q1 P ON D.PREFIX = P.CONCEPT_CD)
WHERE prefix IN (SELECT concept_cd FROM
PCORI_ETL_WEIGHT2.CONCEPT_COUNT_OBS_FACT_17Q1);
答案 1 :(得分:0)
看起来您希望使用子查询进行相关更新以从另一个表中获取总和:
UPDATE DEV02I2B2DEMODATA.partition_obs_2 po
SET COUNT = COUNT + (
SELECT NVL(SUM(CPT_COUNT), 0)
FROM PCORI_ETL_WEIGHT2.CONCEPT_COUNT_OBS_FACT_17Q1 ccof
WHERE ccof.CONCEPT_ID = po.PREFIX
);
或者跳过NVL()
但添加EXISTS
子句以限制更新到另一个表中具有匹配数据的行;如果这个比例很低,那么进行检查可能比更新每一行更好。
使用您的表结构和一些组成的示例数据进行快速演示(为简单起见,所有这些都在一个模式中):
CREATE TABLE "PARTITION_OBS_2"
( "PREFIX" VARCHAR2(500 BYTE),
"COUNT" NUMBER)
/
CREATE TABLE "CONCEPT_COUNT_OBS_FACT_17Q1"
( "CPT_COUNT" NUMBER,
"CONCEPT_CD" VARCHAR2(50 BYTE))
/
insert into PARTITION_OBS_2 values ('CPT:000', 2077);
insert into PARTITION_OBS_2 values ('CPT:001', 90169);
insert into PARTITION_OBS_2 values ('CPT:002', 2626);
insert into CONCEPT_COUNT_OBS_FACT_17Q1 values (1, 'CPT:001');
insert into CONCEPT_COUNT_OBS_FACT_17Q1 values (1, 'CPT:001');
insert into CONCEPT_COUNT_OBS_FACT_17Q1 values (1, 'CPT:001');
insert into CONCEPT_COUNT_OBS_FACT_17Q1 values (2, 'CPT:002');
insert into CONCEPT_COUNT_OBS_FACT_17Q1 values (5, 'CPT:002');
UPDATE partition_obs_2 po
SET COUNT = COUNT + (
SELECT NVL(SUM(CPT_COUNT), 0)
FROM CONCEPT_COUNT_OBS_FACT_17Q1 ccof
WHERE ccof.CONCEPT_CD = po.PREFIX
);
3 rows updated.
column prefix format a20
select * from partition_obs_2;
PREFIX COUNT
-------------------- ----------
CPT:000 2077
CPT:001 90172
CPT:002 2633