oracle查询ORA00907中缺少右括号错误

时间:2014-05-24 10:13:01

标签: oracle

需要的表格 -

PatientMetabolic - (functionNo,patientId,score)

访问 - (visitNo,visitDate,time,amountPaid,receiptNo,service,drug,chiefComplaints,patientId)

患者(患者名称,姓名,性别,DoB,地址,州,邮编,家庭电话,商家电话,婚姻状况,职业,持续时间,单位,种族,注册日期,GPNo,NaturopathNo)

Naturopath (NaturopathNo,name,contactNo,officeStartTime,officeEndTime,emailAddress)

**问题是 - **显示过去6个月内未访问过自然疗法的患者(即姓名,性别,地址,邮政编码,DOB)的详细信息以及患有严重心脏病的患者(代谢筛选问卷中心脏总分> 9。

注意 f6,f26,f27是属于心脏病的功能。 (分数)讲述病情的严重程度,应该大于9

我的查询

SELECT patientid,sum(score) from PATIENTMETABOLIC where FUNCTIONNO = any ('F6','F26','F27') AND patientid IN (SELECT DISTINCT PATIENTID from VISIT where TRUNC(MONTHS_BETWEEN(sysdate, visitdate)) > 6 order by patientid) group by patientid having sum(score) > 9;

1 个答案:

答案 0 :(得分:1)

order by语句的子查询中不能有IN子句。作为一个简化的例子,这有效:

select * from dual
where dummy in (select dummy from dual);

但这会得到ORA-00907

select * from dual
where dummy in (select dummy from dual order by dummy);

SQL Fiddle demo

即使它被允许,也没有实际效果,正如Patrick Hofman所说。

所以在你的情况下,假设你的名字等是正确的,这应该有效:

SELECT patientid,sum(score)
from PATIENTMETABOLIC
where FUNCTIONNO = any ('F6','F26','F27')
AND patientid NOT IN (
  SELECT PATIENTID
  from VISIT
  where TRUNC(MONTHS_BETWEEN(sysdate, visitdate)) > 6
)
group by patientid
having sum(score) > 9;

除了移除order by之外,我还删除了distinct,这只是添加了一个无意义的排序操作;我已将IN更改为NOT IN,因为您说您希望患者访问自然疗法。但我可能错了。

使用= ANY并不常见,但valid;虽然在同一个语句中混合使用等效的IN似乎很奇怪。我个人将其改为IN,尤其是为了避免让人感到困惑......