我有一个家庭作业问题,其中有以下架构:
Emp(eid:integer, ename:string, age:integer, salary:real)
Works(eid:integer, did:integer)
Dept(did:integer, managerid:integer)
以此为基础,我应该构造一个名为
Manager
的单一视图,给出雇员的eid
,ename
以及其经理的eid
和ename
。然后我应该说该视图是否可更新,以及为什么/为什么不可以。因此,我成功创建了查询来获取以下信息:
SELECT
Employee.eid,
Employee.ename,
Manager.mid,
Manager.ename
FROM
(
SELECT Dept.managerid AS mid, ename, did
FROM Emp
INNER JOIN Dept
ON Emp.eid = Dept.managerid
) as Manager
INNER JOIN
(
SELECT ename, Emp.eid, did
FROM Emp
INNER JOIN Works
ON Emp.eid = Works.eid
) AS Employee
ON
Employee.did = Manager.did
AND
Employee.eid != Manager.mid;
但是,当我在语句的顶部添加
CREATE VIEW Manager AS
来创建视图时,最终出现此错误:View's SELECT contains a sub query in the FROM clause
作为参考,我已将代码上传到sqlfiddle。唯一需要做的就是在底部的
CREATE VIEW Manager AS
语句之前添加SELECT
。我想知道是否有一种方法可以某种方式重构该语句,以不使用嵌套的
SELECT
,从而使我只能使用单个视图。不幸的是,我只能使用一个视图进行分配。 最佳答案
子查询是解决此问题的不必要的复杂方法。只需将emp
加入works
,将work
加入dept
,然后再将dept
回到emp
即可。
select e.*, e2.*
from emp e
inner join works w
on w.eid = e.eid
inner join dept d
on w.did = d.did
inner join emp e2
on d.managerid = e2.eid
updated your fiddle
要从中创建视图,您将需要对结果列进行别名化,因为存在重复项。例如:
select e.eid as `employee_id`, e.ename as `employee_name`, e2.eid as `manager_id`, e2.ename as `manager_name`
代替
select e.*, e2.*
关于mysql - 将子查询重写为单个查询,以便可以将其放入SQL View 中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30449814/