gpt4 book ai didi

mysql - 将子查询重写为单个查询,以便可以将其放入 SQL View 中

转载 作者:行者123 更新时间:2023-11-29 12:12:12 26 4
gpt4 key购买 nike

我有一个家庭作业问题,我有这个架构:

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

有了这个,我应该构建一个名为 Manager 的单一 View ,给出员工及其/她的 eidename经理的 eidename。然后我应该说 View 是否可更新,以及为什么/为什么不可以。

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

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 时,我最终收到此错误:View's SELECT contains a sub query in FROM 子句

作为引用,我已将代码上传到 sqlfiddle 。唯一需要做的就是在底部的 SELECT 语句之前添加 CREATE VIEW Manager AS

我想知道是否有一种方法可以重构此语句以不使用嵌套的SELECT,以便我只能使用单个 View 。不幸的是,我的作业只能使用一种 View 。

最佳答案

子查询是解决此问题的一种不必要的复杂方式。只需将 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

要从中创建 View ,您需要为结果列添加别名,因为存在重复项。例如:

select e.eid as `employee_id`, e.ename as `employee_name`, e2.eid as `manager_id`, e2.ename as `manager_name`

而不是选择e.*、e2.*

关于mysql - 将子查询重写为单个查询,以便可以将其放入 SQL View 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30449814/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com