Oracle SQL出现无效关系运算符错误,如何编写正确的查询语句?
修正你的SQL查询并解决「无效关系运算符」错误
首先,咱们来拆解原语句里的几个问题,正是这些问题导致了语法错误:
- 字段名拼写错误:
END DATE中间有空格,应该是END_DATE(Oracle里的字段名如果有空格才需要双引号,但JOB_HISTORY的字段是下划线分隔的END_DATE)。 - 日期常量未加单引号:你写的
93-JAN-01会被Oracle当成数值运算(93减JAN减01),这显然不对,日期常量必须用单引号括起来,比如'01-JAN-1993',或者用标准的DATE '1993-01-01'格式更清晰。 - 关联逻辑不准确:原语句里
EMPLOYEES和JOB_HISTORY用E.JOB_ID=H.JOB_ID关联,这会把所有同职位的员工都关联进来,正确的关联应该是员工ID匹配:E.EMPLOYEE_ID=H.EMPLOYEE_ID。 - 缺少部门表关联:要获取部门名称,需要关联
HR.DEPARTMENTS表,通过职位历史或员工的DEPARTMENT_ID来关联。
接下来是修正后的完整查询语句,完全符合你的需求:
SELECT J.JOB_TITLE AS 职位名称, D.DEPARTMENT_NAME AS 部门名称, E.FIRST_NAME || ' ' || E.LAST_NAME AS 员工全名, E.HIRE_DATE AS 入职日期 FROM HR.JOBS J JOIN HR.JOB_HISTORY H ON J.JOB_ID = H.JOB_ID JOIN HR.EMPLOYEES E ON E.EMPLOYEE_ID = H.EMPLOYEE_ID JOIN HR.DEPARTMENTS D ON D.DEPARTMENT_ID = H.DEPARTMENT_ID -- 若需员工当前部门,可改为D.DEPARTMENT_ID = E.DEPARTMENT_ID WHERE H.START_DATE >= DATE '1993-01-01' AND H.END_DATE <= DATE '1997-08-31';
几点补充说明:
- 用
DATE 'YYYY-MM-DD'是Oracle支持的标准日期字面量,比'DD-MON-YYYY'更不容易因为语言环境导致解析错误。 - 如果需要展示的是职位历史的开始日期而非员工入职日期,把
E.HIRE_DATE换成H.START_DATE即可。
内容的提问来源于stack exchange,提问作者user15361238
相关产品推荐
相关产品推荐

