将子查询重写为单个查询,以便可以将其放入 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
的视图,给出员工的 eid
、ename
和 his/her 经理的 eid
和 ename
。然后我应该说视图是否可更新,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
要从中创建视图,您需要为结果列添加别名,因为存在重复项。例如:
select e.eid as `employee_id`, e.ename as `employee_name`, e2.eid as `manager_id`, e2.ename as `manager_name`
而不是select e.*, e2.*
我有一个家庭作业问题,我有这个模式:
Emp(eid:integer, ename:string, age:integer, salary:real)
Works(eid:integer, did:integer)
Dept(did:integer, managerid:integer)
有了这个,我应该构建一个名为 Manager
的视图,给出员工的 eid
、ename
和 his/her 经理的 eid
和 ename
。然后我应该说视图是否可更新,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
要从中创建视图,您需要为结果列添加别名,因为存在重复项。例如:
select e.eid as `employee_id`, e.ename as `employee_name`, e2.eid as `manager_id`, e2.ename as `manager_name`
而不是select e.*, e2.*