将子查询重写为单个查询,以便可以将其放入 SQL 中的视图中

Rewriting a sub-query into a single query so it can be put into a view in SQL

我有一个家庭作业问题,我有这个模式:

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

有了这个,我应该构建一个名为 Manager 的视图,给出员工的 eidename 和 his/her 经理的 eidename。然后我应该说视图是否可更新,why/why 不是。

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

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。唯一需要做的就是在底部的 SELECT 语句之前添加 CREATE VIEW Manager AS

我想知道是否有办法以某种方式重构此语句以不使用嵌套 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.*