SQL语句调试求助:ORA-00933与ORA-00907错误排查
解决ORA-00933和SQL语法问题
先帮你梳理下问题所在,你的SQL语句有两个核心问题导致了ORA-00933错误,之前的00907也是因为语法逻辑不对:
问题1:WHERE子句的逻辑错误
你写的WHERE RENTER_ID = ((LEASE_END) = '30-JUN-18')完全不符合SQL语法逻辑——这相当于试图把RENTER_ID和一个布尔比较结果(LEASE_END是否等于'30-JUN-18')做相等判断,但Oracle并不支持直接在WHERE子句里用这种布尔表达式赋值的写法。正确的写法应该直接判断LEASE_END的日期:
WHERE LEASE_END = '30-JUN-18'
(如果你的数据库日期格式不是默认匹配这个字符串的,建议用TO_DATE('30-JUN-18', 'DD-MON-RR')来显式转换,避免隐式转换错误)
问题2:聚合函数缺少GROUP BY子句
你使用了Count(DEP_ID)聚合函数,但SELECT列表里还包含了RENTER.RENTER_ID、RENTER_LNAME、APART_BED这些非聚合列。根据SQL的规则,只要SELECT里有聚合函数,所有非聚合的列都必须出现在GROUP BY子句中,否则数据库不知道如何分组计算聚合值。
修正后的完整SQL
SELECT RENTER.RENTER_ID, RENTER_LNAME, Round((Count(DEP_ID) + 1)/APART_BED) AS "PEOPLE / BEDROOM" FROM RENTER JOIN DEPENDENT ON RENTER.RENTER_ID = DEPENDENT.RENTER_ID JOIN LEASE ON LEASE.RENTER_ID = RENTER.RENTER_ID JOIN APARTMENT ON APARTMENT.APART_NUM = LEASE.APART_NUM WHERE LEASE_END = TO_DATE('30-JUN-18', 'DD-MON-RR') GROUP BY RENTER.RENTER_ID, RENTER_LNAME, APART_BED ORDER BY RENTER_ID;
额外说明
- 为什么之前加括号会导致00933?因为你错误地在WHERE子句里嵌套了多余的括号,让SQL解析器无法识别正确的命令结束位置,所以抛出了“SQL命令未正确结束”的错误。
- 如果有的租户没有家属(DEP_ID为NULL),
Count(DEP_ID)会忽略NULL值,得到0,这时候(0+1)/APART_BED就是租户自己的人数除以卧室数,逻辑是对的;如果要包含所有租户(哪怕没有家属),可以把JOIN DEPENDENT改成LEFT JOIN DEPENDENT,这样没有家属的租户也会被统计进来,Count(DEP_ID)依然是0。
内容的提问来源于stack exchange,提问作者Chadwick Pope
相关产品推荐
相关产品推荐

