如何针对分层表创建视图

时间:2011-11-03 21:54:16

标签: sql sql-server hierarchical-data

我正在学习如何使用SQL Server创建视图。我正在尝试在Northwind数据库中添加一个名为Managers的视图,该视图仅显示监督其他员工的员工。这是我到目前为止所做的。

Create View Manager_vw
As
Select LastName,
       FirstName,
       EmployeeID
From Employees
Where 

我所坚持的是如何以及我将如何监督其他员工。我不确定如何做到这一点。如果有人可以帮我理解如何做到这一点。

2 个答案:

答案 0 :(得分:3)

在northwind.dbo.employees中,您会找到通过查看reportsto列来监督其他员工的员工。基本上,您希望返回ID在另一行reportsto列中的员工。这可以这样做:

SELECT LastName,
       FirstName,
       EmployeeID
FROM employees E
WHERE EXISTS(SELECT * FROM Employees WHERE reportsTo = E.EmployeeID)

EXISTS就像一个JOIN,但通常被实现为“半连接”,它会在找到一个匹配的匹配后停止处理(而不是找到所有需要额外的下属员工work)因为它不会返回任何其他记录,所以您还可以节省额外步骤的成本以消除重复(一个JOIN会做更多的工作来处理连接,甚至更多的工作来撤消那些工作做一个DISTINCT是必要的。)

你会注意到我在子查询中引用了E.EmployeeID,它将子查询与外部查询联系起来,这称为相关子查询。

请注意:视图在数据库中占有一席之地但很容易被滥用。当工程师从OO背景进入数据库时​​,视图似乎是一种促进代码继承和可重用性的便捷方式。通常人们最终会发现自己处于嵌套视图的位置,这些视图连接到嵌套视图的嵌套视图。 SQL通过基本上获取每个单独视图的定义并将其扩展为将使DBA哭泣的查询的野兽来处理嵌套视图。

此外,您在示例中遵循了优秀的做法,我鼓励您继续这样做。您单独指定了所有列,从未使用SELECT *指定视图的结果。它最终会破坏你的一天。您会看到我的SELECT *子句中有EXISTS,但EXISTS未返回结果集,优化程序将在该特定情况下忽略该结果集。

答案 1 :(得分:3)

这是另一种选择:

SELECT DISTINCT manager_tbl.*    
FROM Employees AS staff_tbl
JOIN Employees AS manager_tbl  
    ON staff_tbl.ReportsTo = manager_tbl.EmployeeID

改编自this site。有许多示例查询,您可能会发现它们很有趣且有用。

注意:

所有在一起:

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