我有一个家庭作业问题,其中有以下架构:

Emp(eid:integer, ename:string, age:integer, salary:real)
Works(eid:integer, did:integer)
Dept(did:integer, managerid:integer)


以此为基础,我应该构造一个名为Manager的单一视图,给出雇员的eidename以及其经理的eidename。然后我应该说该视图是否可更新,以及为什么/为什么不可以。

因此,我成功创建了查询来获取以下信息:

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/

10-16 23:17
查看更多