Sql 如何根据分层表创建视图
我正在学习如何使用SQL server创建视图。我试图在Northwind数据库中添加一个名为Managers的视图,该视图仅显示管理其他员工的员工。这就是我目前所拥有的Sql 如何根据分层表创建视图,sql,sql-server,hierarchical-data,Sql,Sql Server,Hierarchical Data,我正在学习如何使用SQL server创建视图。我试图在Northwind数据库中添加一个名为Managers的视图,该视图仅显示管理其他员工的员工。这就是我目前所拥有的 Create View Manager_vw As Select LastName, FirstName, EmployeeID From Employees Where 我一直坚持的是,我将如何监督其他员工。我不知道该怎么做。如果有人能帮助我了解如何做到这一点。在northwind.dbo.e
Create View Manager_vw
As
Select LastName,
FirstName,
EmployeeID
From Employees
Where
我一直坚持的是,我将如何监督其他员工。我不知道该怎么做。如果有人能帮助我了解如何做到这一点。在northwind.dbo.employees中,您可以通过查看
报告至列找到监督其他员工的员工。基本上,您希望将id位于reports中的员工返回到另一行的列中。可以这样做:
SELECT LastName,
FirstName,
EmployeeID
FROM employees E
WHERE EXISTS(SELECT * FROM Employees WHERE reportsTo = E.EmployeeID)
EXISTS
类似于一个连接
,但通常作为“半连接”实现,它在找到一个匹配项后停止处理(而不是找到需要额外工作的所有下属员工),因为它不会返回任何其他记录,您还可以节省消除重复的额外步骤的成本(一个JOIN
将做更多的工作来处理该连接,甚至更多的工作来撤销通过执行DISTINCT
不必要的工作)
您会注意到,我在子查询中引用了E.EmployeeID,它将子查询与外部查询关联起来,这称为关联子查询
警告:视图在数据库中有其位置,但很容易被误用。当工程师从OO背景访问数据库时,视图似乎是促进代码继承和重用的方便方法。通常,人们最终会发现自己处于一个位置,即嵌套视图已连接到嵌套视图的嵌套视图。SQL处理嵌套视图的方法基本上是获取每个视图的定义,并将其扩展为一个会让DBA大哭的查询野兽
此外,您在示例中遵循了出色的实践,我鼓励您继续这样做。您单独指定了所有列,切勿使用SELECT*
指定视图的结果。它最终会毁了你的一天。您将看到,在我的EXISTS
子句中确实有一个SELECT*
,但是EXISTS
不会返回结果集,在这种特定情况下,优化器将忽略该结果集 还有一个选择:
SELECT DISTINCT manager_tbl.*
FROM Employees AS staff_tbl
JOIN Employees AS manager_tbl
ON staff_tbl.ReportsTo = manager_tbl.EmployeeID
改编自。这里有许多示例查询,您可能会发现它们非常有趣和有用
注:
- 使用
DISTINCT
关键字,因为单个经理可以有多个直接下属DISTINCT
将忽略这种一对多关系引起的重复
- Northwind数据库中的Employees表就是一个示例
总而言之:
CREATE VIEW Manager_vw
AS
SELECT DISTINCT manager_tbl.*
FROM Employees AS staff_tbl
JOIN Employees AS manager_tbl
ON staff_tbl.ReportsTo = manager_tbl.EmployeeID
在Employees
中是否有指定员工是否为经理的字段?您是否有另一个表指定哪个员工管理谁?该字段是Employees.ReportsTo,它是Employees.EmployeeID主键的外键。谢谢,您解释得很好。是的,我现在正在学习相关子查询。谢谢你的网站。你能读到的每一种资源都会有帮助。