2009-12-12 3 views
1

Je travaille mon chemin à travers ce explanation of Common Table Expressions at MSDN et je suis tombé sur le code reproduit ci-dessous. Quelqu'un peut-il m'expliquer ce qu'il fait et comment il le fait? Je suis assez sûr que je comprends le concept de la vue qui est créée dans la première moitié. Mais le SELECT qui se joint deux fois à cette vue me trouble.Que fait ce code SQL (rejoignant deux fois la même vue)?

CREATE VIEW vwMyView AS 
SELECT EmployeeID, COUNT(*) AS NumOrders, MAX(OrderDate) AS MaxDate 
FROM Orders 
GROUP BY EmployeeID 

SELECT 
    e.EmployeeID, oe.NumOrders, oe.MaxDate, e.ReportsTo AS ManagerID, 
    om.NumOrders, om.MaxDate 
FROM 
    Employees AS e 
    INNER JOIN vwMyView AS oe ON e.EmployeeID = oe.EmployeeID 
    INNER JOIN vwMyView AS om ON e.ReportsTo = om.EmployeeID 

Répondre

0

Il vous permet de joindre "om.NumOrders" et "om.MaxDate" dans chaque ligne retournée où "om.EmployeeID" correspond à "e.ReportsTo" ou en d'autres termes, comprend deux colonnes indiquant [NumOrders] et [ MaxDate] pour qui "e.EmployeeID" "rend compte" (par exemple, les coordonnées du manager à côté des données de l'employé)

Pourquoi? Je ne sais pas, je ne connais pas les données, les exemples ou les documents auxquels vous avez fait référence. Mais c'est ce que cette jointure fait.

Le but de la vue est de générer ces valeurs agrégées (NumOrders et MaxDate) pour chaque employé.

0

Le tableau des employés a une colonne "RelèveDe" qui sera l'ID du gestionnaire de l'employé. En rejoignant deux fois (une fois comme oe et une fois comme om), l'instruction SELECT vous donnera les NumOrders et MaxDate pour chaque employé suivi de ceux de leur manager.

0

Il s'agit d'une requête à une table de jointure automatique. Fondamentalement, la table va stocker les valeurs de tous les employés, y compris une référence auto à la personne à laquelle ils se rapportent.

Ainsi, la vue est utilisée pour joindre à la table les employés pour récupérer les données d'un employé donné, puis également les données de la personne à laquelle elles se rapportent.

+0

Pas vraiment - les deux instances de vue rejoignent la table Employees, pas elles-mêmes. –

0

La clé pour comprendre les éléments suivants:

FROM EMPLOYEES e 
JOIN vwMyView AS oe ON e.EmployeeID = oe.EmployeeID 
JOIN vwMyView AS om ON e.ReportsTo = om.EmployeeID 

... est le REJOIGNEZ-critères. L'instance oe est une copie liée par le e.employeeid; l'instance om est liée à l'aide du e.reportsto.

1

La première jointure obtient des informations sur l'employé et la deuxième jointure obtient des informations sur le responsable de ce salarié (qui est également un salarié).