I am learning how to create view using SQL server. I am trying to add a view called Managers in the Northwind database that shows only employees that supervise other employees. This is what I have so far.
Create View Manager_vw
As
Select LastName,
FirstName,
EmployeeID
From Employees
Where
What I am stuck on is how and I going to put in supervise other employees. I am not to sure how to do this. If someone can help me understand how to do this.
In northwind.dbo.employees you would find employees who supervise other employees by looking the
reportstocolumn. Basically you want to return employees whose id is in thereportstocolumn in another row. That can be done like this:The
EXISTSis like aJOINbut is usually implemented as a “semi-join” which will stop processing after it finds a singe match (rather than finding all the subordinate employees which would take extra work) Because it doesn’t return any additional records, you also save the cost of the additional step to eliminate duplicates (aJOINwould do more work to process the join, and even more work to undo the work that wasn’t necessary by doing aDISTINCT.)You’ll notice that I reference E.EmployeeID in the subquery, which relates the subquery to the outer query, this is called a Correlated Subquery.
A word of caution: Views have their place in a DB but can easily be misused. When an engineer comes to the database from an OO background, views seem like a convenient way to promote inheritance and reusability of code. Often people eventually find themselves in a position where they have nested views joined to nested views of nested views. SQL processes nested views by essentially taking the definition of each individual view and expanding that into a beast of a query that will make your DBA cry.
Also, you followed excellent practice in your example and I encourage you to continue this. You specified all your columns individually, never ever use
SELECT *to specify the results of your view. It will, eventually, ruin your day. You’ll see I do have aSELECT *in myEXISTSclause butEXISTSdoes not return a resultset and the optimizer will ignore that in that specific case.