需要的表格 -
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;
答案 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);
即使它被允许,也没有实际效果,正如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
,尤其是为了避免让人感到困惑......