我正在学习如何使用SQL Server创建视图。我正在尝试在Northwind数据库中添加一个名为Managers的视图,该视图仅显示监督其他员工的员工。这是我到目前为止所做的。
Create View Manager_vw
As
Select LastName,
FirstName,
EmployeeID
From Employees
Where
我所坚持的是如何以及我将如何监督其他员工。我不确定如何做到这一点。如果有人可以帮我理解如何做到这一点。
答案 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。有许多示例查询,您可能会发现它们很有趣且有用。
注意:
使用DISTINCT
关键字,因为单个经理可以拥有多个直接报告。 DISTINCT
将忽略这种一对多关系造成的重复。
Northwind数据库中的Employees表是hierarchical relationship modeled in a single table的示例。
所有在一起:
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