使用Oracle案例函数的问题

时间:2017-03-30 17:09:18

标签: sql oracle

我正在尝试查找创建一个查询,该查询将返回一组员工的姓氏及其附加的成绩等级(在另一个表中,没有与工作人员一起提供的外键关系)。

到目前为止,我有这个,但它正在返回一个“缺少关键字”错误。这有什么问题?/我的逻辑错了吗?

姓氏和工资在员工/员工表中。 成绩水平在工作成绩表中。

    select last_name, salary, 
CASE grade_level
WHEN  lowest_sal >= 1000 THEN 'A'
WHEN lowest_sal >= 3000  THEN 'B'
WHEN lowest_sal >= 6000 THEN 'C'
WHEN lowest_sal >= 10000 THEN 'D'
WHEN lowest_sal >= 15000  THEN 'E'
ELSE 'F'
END 
FROM employees, job_grades 
WHERE department_id > 50;

3 个答案:

答案 0 :(得分:0)

CASE声明中存在语法错误

重要的是 - 您错过了JOIN条件

SELECT LAST_NAME
    , SALARY
    , CASE 
        WHEN LOWEST_SAL >= 1000 THEN 'A'
        WHEN LOWEST_SAL >= 3000 THEN 'B'
        WHEN LOWEST_SAL >= 6000 THEN 'C'
        WHEN LOWEST_SAL >= 10000 THEN 'D'
        WHEN LOWEST_SAL >= 15000 THEN 'E'
        ELSE 'F'
    END AS GRADE_LEVEL
FROM EMPLOYEES
    JOIN JOB_GRADES 
        ON EMPLOYEES.ID = JOB_GRADES.EMP_ID 
WHERE DEPARTMENT_ID > 50;

答案 1 :(得分:0)

对每个人都可能遇到这个问题。我有点愚蠢,因为我不需要使用CASE,但如果你需要检查上面给出正确答案的答案。

以下是适合我的代码。它基本上是使用JOIN ON子句来连接没有关系的2个表。

 select last_name, salary, grade_level
FROM employees JOIN job_grades ON (salary BETWEEN lowest_sal AND highest_sal)
WHERE department_id > 50;

答案 2 :(得分:0)

您刚刚将SQL从非ANSI标准转换为ANSI标准。但是使用非ANSI标准可以实现同样的目的。我在原始查询中看到,您尝试加入表但未定义加入条件。这些表之间是否存在关系完整性(外键)并不重要。加入2个表时,必须使用加入条件。

                SELECT 
                LAST_NAME, 
                SALARY, 
                CASE GRADE_LEVEL
                    WHEN  LOWEST_SAL >= 1000 THEN 'A'
                    WHEN LOWEST_SAL >= 3000  THEN 'B'
                    WHEN LOWEST_SAL >= 6000 THEN 'C'
                    WHEN LOWEST_SAL >= 10000 THEN 'D'
                    WHEN LOWEST_SAL >= 15000  THEN 'E'
                ELSE 'F'
                END 
            FROM 
                EMPLOYEES EMP, JOB_GRADES JOBS --**MISSING Joining Criteria**
            WHERE
               DEPARTMENT_ID > 50;   

为了解决这个问题,你需要像下面那样

                SELECT 
                LAST_NAME, 
                SALARY, 
                CASE GRADE_LEVEL
                    WHEN  LOWEST_SAL >= 1000 THEN 'A'
                    WHEN LOWEST_SAL >= 3000  THEN 'B'
                    WHEN LOWEST_SAL >= 6000 THEN 'C'
                    WHEN LOWEST_SAL >= 10000 THEN 'D'
                    WHEN LOWEST_SAL >= 15000  THEN 'E'
                ELSE 'F'
                END 
            FROM 
                EMPLOYEES EMP, JOB_GRADES JOBS 
            WHERE
                 EMP.EMPLOYEES.ID = JOB_GRADES.EMP_ID --**This is the FIX**
               AND DEPARTMENT_ID > 50;