2011-11-03 72 views
2

我正在學習如何使用SQL Server創建視圖。我試圖在Northwind數據庫中添加一個名爲Managers的視圖,該視圖僅顯示監督其他員工的員工。這是我迄今爲止所擁有的。如何根據分層表創建視圖

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

我堅持的是我將如何和我監督其他員工。我不確定如何做到這一點。如果有人能幫助我理解如何做到這一點。

+3

你在'Employees'一個字段,規定如果員工是經理?你有另外一張表格來說明哪個員工監督誰? –

+0

該字段是Employees.ReportsTo,它是Employees.EmployeeID主鍵的外鍵。 –

回答

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但通常爲實現「半加入」找到一個燎賽後將停止處理(而不是尋找所有下屬員工哪些會花費額外的工作)因爲它不會返回任何額外的記錄,所以您還可以節省額外步驟的成本以消除重複項(一個JOIN可以做更多的工作來處理連接,甚至還有更多的工作可以撤消那些沒有工作量的工作, t

你會注意到我在子查詢中引用了E.EmployeeID,它將子類y到外部查詢,這稱爲相關子查詢。

請注意:視圖在數據庫中有自己的位置,但很容易被濫用。當工程師從面向對象的背景來到數據庫時,視圖看起來像是促進代碼的繼承和重用的便捷方式。通常人們最終會發現自己處於嵌套視圖嵌套視圖的嵌套視圖。 SQL主要通過對每個單獨視圖的定義進行處理來嵌套視圖,並將其擴展爲查詢的野獸,這會使DBA哭泣。

此外,你在你的例子中遵循了優秀的做法,我鼓勵你繼續這樣做。您單獨指定了所有列,從未使用SELECT *指定視圖的結果。它最終會毀了你的一天。你會看到我的EXISTS子句中有SELECT *,但EXISTS不返回結果集,優化程序將忽略該特定情況下的結果集。

+0

謝謝,你解釋得很好。是的,我正在學習相關子查詢。 – norris1023

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 
+0

謝謝你的網站。你可以閱讀的每一個資源總是有幫助的。 – norris1023

相關問題