【问题标题】:Inner join in the same table同一张表内连接
【发布时间】:2023-02-23 15:03:37
【问题描述】:

早上好,我正在尝试对同一个表使用内部联接来查看每个管理员(REPORTS_TO)有多少员工,为此我使用了一个子查询但是当我运行它时会抛出一个我无法识别的错误,如果有人有对此有更好的想法会对我有很大帮助。 这是我的查询:

SELECT E.TITLE,T.REPORTS_TO,T.TOTAL
FROM EMPLOYEES E
INNER JOIN (
    SELECT ER.REPORTS_TO,COUNT(ER.EMPLOYEE_ID)AS TOTAL
    FROM EMPLOYEES ER
    GROUP BY ER.REPORTS_TO)T
ON E.EMPLOYEE_ID=T.EMPLOYEE_ID
GROUP BY E.TITLE,T.REPORTS_TO,T.TOTAL;

这是我在运行查询时遇到的错误:

ORA-00904: "T" - "EMPLOYEE_ID": invalid identifier
00904. 00000 - "%s: invalid identifier".
*Cause:    
*Action:
Error on line: 142, column: 18.

子查询显示以下内容:

REPORTS_TO      TOTAL
---------- ----------
         2          5
                    1
         5          3

例如这个查询:

SELECT ER.TITLE,ER.REPORTS_TO,COUNT(ER.EMPLOYEE_ID)AS TOTAL_EMPLEADOS_A_CARGO
FROM EMPLOYEES ER
GROUP BY ER.TITLE,ER.REPORTS_TO

显示以下内容:

TITLE                          REPORTS_TO TOTAL_EMPLEADOS_A_CARGO
------------------------------ ---------- -----------------------
Sales Representative                    2                       3
Vice President, Sales                                           1
Sales Manager                           2                       1
Sales Representative                    5                       3
Inside Sales Coordinator                2                       1

我正在寻找的是查询返回如下内容:

TITLE                          TOTAL_EMPLEADOS_A_CARGO
----------------------------- -----------------------
Vice President, Sales                               5
Sales Manager                                       3

【问题讨论】:

    标签: oracle11g oracle-sqldeveloper


    【解决方案1】:

    这是别名(假设是表名)为T的子查询(假设它代表一个普通表):

    SELECT ER.REPORTS_TO,
           COUNT(ER.EMPLOYEE_ID) AS TOTAL
    FROM EMPLOYEES ER
    GROUP BY ER.REPORTS_TO
    

    EMPLOYEE_ID 专栏在这里,是吗? (除了 COUNT 函数的参数,但那是无关紧要的。)

    你写的查询然后这样做:

    select ...
    from employees e join t on e.employee_id = t.employee_id
                                               -------------
                                        there's no EMPLOYEE_ID in T
    

    这就是为什么 Oracle 说:标识符 T.EMPLOYEE_ID无效的;它不存在,你不能使用不存在的东西。


    该怎么办?没有把握。你可以

    • 加入REPORTS_TO(因为它同时存在于EMPLOYEEST),或者
    • EMPLOYEE_ID 包含到 T 子查询中(但是你必须在其上添加 GROUP BY ,这会返回错误的结果)

    如果可能,请发布您想要获得的示例数据和结果。那会带来一个视觉的你的问题的组成部分,说明问题,这样社区就不必猜测你想做什么。

    【讨论】: