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
正常工作。
答案 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
这将有效。
这就是确定名称的范围。
employees
,tableB
tableB
是从包含employees
,tableA
构成子查询的表在子查询范围之外是不可见的。
下面是与缩进相同的查询,它清楚地表明了子查询的级别。
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 JOIN
,RIGHT OUTER JOIN
或仅JOIN
USING
条款。
如果我是正确的,则FULL OUTER JOIN不能与USING子句一起运行。因此,您的Departments表可能无法有效地加入TableA结果集,导致dep_man_id
引用成为无效的标识符。