【问题标题】:Oracle SQL Subquery Syntax Error caused by ORDER BYORDER BY 导致的 Oracle SQL 子查询语法错误
【发布时间】:2020-06-23 03:47:28
【问题描述】:

我在 Oracle SQL 查询中遇到语法错误。查询应该让我了解员工的部门。如果员工没有部门(null),我想要层次结构中第一个经理的部门,它有一个部门。

SELECT department_id FROM department
WHERE department_id =
(
    SELECT department_id FROM employee
    WHERE department_id IS NOT NULL AND rownum = 1
    start WITH employee_id = 19
    connect by employee_id = prior manager_id
    ORDER BY level
);

错误信息是这样的:

ORA-00907: missing right parenthesis
00907. 00000 -  "missing right parenthesis"
*Cause:    
*Action:
Error at Line: 8 Column: 2

我已经编写了一个替代查询,它可以完成这项工作。但我对此不太满意。

SELECT department_id FROM department
WHERE department_id = 
(
    SELECT department_id FROM employee
    WHERE level =
    (
        SELECT MIN(level) FROM employee
        WHERE department_id IS NOT NULL
        start WITH employee_id = 19
        connect by employee_id = prior manager_id
    )
    start WITH employee_id = 19
    connect by employee_id = prior manager_id
);

您知道如何解决第一个查询吗?还是简化第二个? 先感谢您。

【问题讨论】:

  • 您不需要在子查询中进行排序。只需删除ORDER BY level
  • 我可以确定,我得到了层次结构中最低级别的员工(部门不为空)吗?

标签: sql oracle subquery ora-00907


【解决方案1】:

在您的第一个查询中,@Barbaros 正确地说,不需要 ORDER BY,甚至 rownum = 1 也不会按照您的想法行事。

以下查询是否满足您的要求:

SELECT
    E.EMPLOYEE_ID,
    CASE WHEN E.DEPARTMENT_ID IS NOT NULL 
         THEN E.DEPARTMENT_ID
         ELSE LAG(D.DEPARTMENT_ID IGNORE NULLS) OVER(ORDER BY LEVEL)
    END AS DEPARTMENT_ID
FROM
    EMPLOYEE E
    LEFT JOIN DEPARTMENT D ON E.DEPARTMENT_ID = D.DEPARTMENT_ID
START WITH E.EMPLOYEE_ID = 19
CONNECT BY E.EMPLOYEE_ID = PRIOR E.MANAGER_ID

干杯!!

【讨论】:

  • 非常感谢!我认为这对我有用。虽然我不得不调整查询以在 Oracle 10g 下工作。 第 5 行: ELSE first_value(D.DEPARTMENT_ID ignore nulls) OVER(ORDER BY LEVEL rows between 1 following and unbounded following)
猜你喜欢
  • 2010-11-02
  • 2012-03-17
  • 1970-01-01
  • 2011-01-09
  • 1970-01-01
  • 2016-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多