sql表别名的问题

时间:2015-02-05 00:22:10

标签: sql oracle alias

SELECT last_name
FROM   employees,
       (SELECT last_name AS man_ln
        FROM   employees
               JOIN (SELECT last_name              AS emp_ln,
                            employee_id,
                            Employees.manager_id   AS emp_man_id,
                            Departments.manager_id AS dep_man_id
                     FROM   employees
                            FULL OUTER JOIN Departments USING (department_id)
                     WHERE  Employees.manager_id <> Departments.manager_id) tableA
                 ON employees.employee_id = tableA.emp_man_id) tableB
WHERE  employees.employee_id = tableA.dep_man_id 

我尝试了他的查询,但收到了:

  

ORA-00904:“TABLEA”。“DEP_MAN_ID”:标识符无效

我可以访问TableA吗?

p.s tableA.emp_man_id正常工作。

3 个答案:

答案 0 :(得分:1)

SELECT last_name AS man_ln FROM employees没有别名,因此我将employees作为别名。试试这个问题:

SELECT last_name
FROM   employees,
       ((SELECT last_name AS man_ln
        FROM   employees) AS employees
        JOIN (SELECT last_name              AS emp_ln,
                     employee_id,
                     Employees.manager_id   AS emp_man_id,
                     Departments.manager_id AS dep_man_id
              FROM   employees
                     FULL OUTER JOIN Departments USING (department_id)
              WHERE  Employees.manager_id <> Departments.manager_id) tableA
          ON employees.employee_id = tableA.emp_man_id) tableB
WHERE  employees.employee_id = tableB.dep_man_id 

答案 1 :(得分:1)

你需要做两件事:

在你的内部子查询中,执行

SELECT last_name as man_ln, tableA.dep_manId

并在外部查询中,用

替换WHERE子句
WHERE employees.employee_id = tableB.dep_man_id

这将有效。

这就是确定名称的范围。

  • 主查询包含表格employeestableB
  • tableB是从包含employeestableA
  • 子查询创建的

构成子查询的表在子查询范围之外是不可见的。

下面是与缩进相同的查询,它清楚地表明了子查询的级别。

SELECT 
    last_name 
FROM 
    employees,         
    (
        SELECT 
            last_name AS man_ln,
            tableA.dep_man_id    -- << You need this to make it visible to the outer query 
        FROM 
            employees 
        JOIN
            (SELECT 
                last_name AS emp_ln, 
                employee_id, 
                Employees.manager_id AS emp_man_id, 
                Departments.manager_id AS dep_man_id  
             FROM 
                employees 
             FULL OUTER JOIN 
                Departments 
             USING (department_id) 
             WHERE Employees.manager_id <> Departments.manager_id
          ) tableA
          ON employees.employee_id = tableA.emp_man_id 
     ) tableB  
WHERE employees.employee_id = tableB.dep_man_id

答案 2 :(得分:0)

我不是Oracle专家,但请查看FULL OUTER JOIN...USING()子句。尝试将USING (department_id)调整为ON Departments.department_id = Employees.department_id或指定LEFT OUTER JOINRIGHT OUTER JOIN或仅JOIN USING条款。

如果我是正确的,则FULL OUTER JOIN不能与USING子句一起运行。因此,您的Departments表可能无法有效地加入TableA结果集,导致dep_man_id引用成为无效的标识符。