在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
不返回結果集,優化程序將忽略該特定情況下的結果集。
你在'Employees'一個字段,規定如果員工是經理?你有另外一張表格來說明哪個員工監督誰? –
該字段是Employees.ReportsTo,它是Employees.EmployeeID主鍵的外鍵。 –