Sql 如何根据分层表创建视图

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

我正在学习如何使用SQL server创建视图。我试图在Northwind数据库中添加一个名为Managers的视图,该视图仅显示管理其他员工的员工。这就是我目前所拥有的

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主键的外键。谢谢,您解释得很好。是的,我现在正在学习相关子查询。谢谢你的网站。你能读到的每一种资源都会有帮助。