2012-10-29 115 views
1

我在包裝我的頭時遇到了困難,應該是MS SQL中一個非常簡單的查詢。我有兩個表格:EmployeesDepartments來自同一個數據表的SQL子查詢

Employees由標準項目:ID (pkey int)FNameLName,... DepartmentID

DepartmentsDepartmentID,DepartmentName,...,ManagerID組成。

Employees.DepartmentIDDepartments.DepartmentID之間有一個關係,Departments.ManagerIDEmployees.EmployeeID之間有一個關係。

換句話說,每個員工都有一個部門,每個部門都有一個也是員工的經理。

我正在嘗試創建一個顯示員工姓名,部門和部門經理的視圖。

我不斷收到一個錯誤,使用此代碼時,多個值被返回:

SELECT 
Employees_1.EmployeeID, Employees_1.FirstName, Employees_1.LastName, 
Departments_1.DepartmentName, 
(SELECT 
    dbo.Employees.LastName 
    FROM dbo.Employees 
    INNER JOIN dbo.Departments 
     ON dbo.Departments.DepartmentManager = dbo.Employees.EmployeeID 
) AS ManagerName 
FROM dbo.Employees AS Employees_1 
INNER JOIN dbo.Departments AS Departments_1 
    ON Employees_1.Department = Departments_1.DepartmentID 
    AND Employees_1.EmployeeID = Departments_1.DepartmentManager 

如何加入回基於從關係相同的表(不同行)任何想法第二張桌子?

回答

3

我會建議反對子查詢(他們更加昂貴),以支持另一個連接。 第二次加入將從部門表返回到部門經理ID的emp表中到員工的員工ID。

(我添加了列別名其中爲了清楚 - 他們絕不需要)

SELECT 
    emp.EmployeeID   "EmpID", 
    emp.FirstName   "EmpFirst", 
    emp.LastName   "EmpLast", 
    dept.DepartmentName  "DeptName", 
    deptMgrEmp.FirstName "MgrFirst", 
    deptMgrEmp.LastName  "MgrLast" 
FROM 
    dbo.Employees as emp 
    LEFT JOIN dbo.Departments as dept 
    on emp.DepartmentID = dept.DepartmentID 
    LEFT JOIN dbo.Employees as deptMgrEmp 
    on dept.ManagerID = deptMgrEmp.EmployeeID 

這裏是一個很好的線程討論JOIN VS子查詢link

+0

使用Left(外部)連接可確保顯示所有員工,而不管他們是否分配了部門/經理。如果要隱藏未進一步關聯的員工/部門,請使用內部公司。 –

+0

+1的JOIN與子查詢討論鏈接:) – Palpatim

+0

@Ray K謝謝,這讓我有一個好開始。我的代碼中有些東西是極其錯誤的,因爲我收到了錯誤的名字(如果有的話)。 MS SQL的查詢生成器用左外部連接替換您的左連接,並且由於您提到它們可能是不必要的,所以我將列別名留下。 在我的查詢中,我有鍵顯示,並且它們正確地填充,但在我的查詢結果中,部門經理的名稱應該是我通過員工ID獲取員工列表。 (例如,第-1名員工deptmgrID = 2,顯示NULL;第2名員工deptmgrID = 2,顯示員工1的姓名;第3名員工ID = 2,2的姓名) – gwhenning

0

在SELECT子句

(SELECT dbo.Employees.LastName FROM dbo.Employees INNER JOIN dbo.Departments ON dbo.Departments.DepartmentManager = dbo.Employees.EmployeeID)

你需要通過過濾部門ID。

現在,它會返回所有部門的所有經理?

+0

@Ray K -Disregard先前的評論,複製你的代碼,改變一個或兩個變量名稱,它的工作。奇怪的是,我只是使用GUI來選擇我想要的字段,然後修改代碼以使其看起來像您的。再次感謝你! – gwhenning

2
SELECT 
    e.EmployeeId, 
    e.FirstName, 
    e.LastName, 
    d.DepartmentName, 
    m.EmployeeId as ManagerId 
    m.FirstName as ManagerFirstName, 
    m.LastName as ManagerLastName 
FROM 
    dbo.Employees e 
    JOIN dbo.Departments d 
    ON d.DepartmentId = e.DepartmentId 
    JOIN dbo.Employees m 
    ON d.DepartmentManager = m.EmployeeID 

注:未經測試的代碼,但這個想法是,你可以簡單地別名Employees表爲「M」(經理人),並加入回去吧,鍵控對經理人的EmployeeId

+0

我注意到它也將SELECT dbo.Employees.EmployeeID更改爲SELECT TOP(100)PERCENT dbo.Employees.EmployeeID。 – gwhenning