ORA-00937:不是单组组函数PL / SQL问题

时间:2014-06-30 11:53:12

标签: sql oracle group-by

首先,我知道ORA-000937是一个常见的问题,有一个明显的答案,但我还没有找到任何可能指出可能解决方案的结果。

快速规格; 国家结核病/艾滋病毒报告,根据患者的医疗记录/遭遇/访问和提供的药物。这只是报告的一小部分,它循环所有患者药物,并计算其中大部分数字的计算日期,我们不存储历史/汇总数据,所有内容在请求时汇总。我之所以提到这一点,是因为我希望有一些建议可以摆脱GTT,而不是使用MVIEW - 我听到了,但不是,不是解决方案。

这是我的问题,这是我在函数中填充GTT的一个查询,它存储聚合结果。我已经构建了我的数据收集,以减少服务器负载,因为医疗表超过1200万条记录。 (每位患者默认3次。)

这是GTT

CREATE GLOBAL TEMPORARY TABLE EKAPAII.TEMP_ART_VISIT_MEDS
(
EPISODE_ID      NUMBER,
LAST_MEDS_DATE  DATE
)
ON COMMIT DELETE ROWS
RESULT_CACHE (MODE DEFAULT)
NOCACHE;


CREATE UNIQUE INDEX EKAPAII.TEMP_ART_VISIT_MEDS_PK ON EKAPAII.TEMP_ART_VISIT_MEDS
(EPISODE_ID);


ALTER TABLE EKAPAII.TEMP_ART_VISIT_MEDS ADD (
CONSTRAINT TEMP_ART_VISIT_MEDS_PK
PRIMARY KEY
(EPISODE_ID)
USING INDEX EKAPAII.TEMP_ART_VISIT_MEDS_PK
ENABLE VALIDATE);

我的简单插入查询

INSERT INTO temp_art_visit_meds (EPISODE_ID, LAST_MEDS_DATE) 
SELECT episode_id, encounter_date + number_of_days
FROM (  SELECT enc_meds.episode_id,
MAX (enc_meds.encounter_date) encounter_date,
MAX (
CASE
WHEN (NVL (meds.number_of_days, 0) > 150)
THEN
90
ELSE
NVL (meds.number_of_days, 0)
END)
number_of_days
FROM temp_art_visit enc_meds,
vd_medication meds,
dl_drugs_episode_class dlc,
(  SELECT latest_meds_visit.episode_id,
MAX (latest_meds_visit.encounter_date)
   encounter_date
FROM temp_art_visit latest_meds_visit,
vd_medication latest_meds,
dl_drugs_episode_class dc
WHERE     latest_meds_visit.encounter_id =
       latest_meds.encounter_id
AND latest_meds.drug_id = dc.drug_id
AND dc.sd_drug_application_id = 8401
GROUP BY latest_meds_visit.episode_id) latest_meds
WHERE     enc_meds.encounter_id = meds.encounter_id
AND enc_meds.episode_id = latest_meds.episode_id
AND enc_meds.encounter_date =
latest_meds.encounter_date
AND meds.drug_id = dlc.drug_id
AND dlc.sd_drug_application_id = 8401
AND meds.active_flag = 'Y'
GROUP BY enc_meds.episode_id);

现在我的错误是,ORA-000937不是单组组功能,但是如果我在普通的编辑器窗口中运行这个查询就可以了,但是当我在包体本身执行select查询时,我得到了ORA-000937,调用该函数不会返回任何错误,即使我有一个异常块来处理任何错误。

任何帮助都可以,我明白这个错误只能在运行时发生,而不是在编译时发生?或者我是从pl / sql块运行查询的事实吗?

Toad for Oracle 12.5版 - 尽管它的荣耀。 (讽刺)

再次,请原谅我,如果已经被要求/回答了。

编辑 - 解决方案

因此,经过几个小时的故障排除后,我能够理解为什么会产生这个错误。首先是固定查询;

INSERT INTO temp_art_visit_meds (EPISODE_ID, LAST_MEDS_DATE) 
SELECT enc_meds.episode_id , 
TRUNC( MAX (enc_meds.encounter_date)) + MAX (CASE WHEN (NVL (meds.number_of_days, 0) > 150) THEN 90 ELSE NVL (meds.number_of_days, 0) END) last_meds_date
FROM temp_art_visit enc_meds,
vd_medication meds,
dl_drugs_episode_class dlc,
(  SELECT latest_meds_visit.episode_id,
MAX (latest_meds_visit.encounter_date) encounter_date
FROM temp_art_visit latest_meds_visit,
vd_medication latest_meds,dl_drugs_episode_class dc
WHERE     latest_meds_visit.encounter_id = latest_meds.encounter_id
AND latest_meds.drug_id = dc.drug_id
AND dc.sd_drug_application_id = 8401
GROUP BY latest_meds_visit.episode_id) latest_meds
WHERE     enc_meds.encounter_id = meds.encounter_id
AND enc_meds.episode_id = latest_meds.episode_id
AND enc_meds.encounter_date = latest_meds.encounter_date
AND meds.drug_id = dlc.drug_id
AND dlc.sd_drug_application_id = 8401
AND meds.active_flag = 'Y'                              
GROUP BY enc_meds.episode_id,  meds.number_of_days, enc_meds.encounter_date; 

看起来问题是由于子查询的数量,我试图使用不同的提示优化器而无济于事。如果仔细查看第一个查询,您会注意到我基本上汇总了聚合结果的结果,因此列的encounter_date,episode_id,number_of_days不再“可用”,所以即使我在上一次添加了相应的GROUP BY子句(外部)子查询,Oracle将无法对这些列名称/标识符进行分组。

我不确定为什么这只会在PACKAGE BODY中失败,并且在执行时没有返回任何SQLERR或SQLCODE。

快乐的日子。

0 个答案:

没有答案