1

私は、MS SQL で非常に単純なクエリであるべきものに頭を悩ませています。と の 2 つのテーブルがEmployeesありDepartmentsます。

EmployeesID (pkey int)FNameLName、 ... 、の標準アイテムで構成されますDepartmentID

DepartmentsDepartmentIDDepartmentName、 ... 、 で構成されますManagerID

からEmployees.DepartmentIDDepartments.DepartmentIDの関係、および と の間の関係がDepartments.ManagerIDありEmployees.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

2 番目のテーブルの関係に基づいて、同じテーブル (別の行) に結合する方法についてのアイデアはありますか?

4

3 に答える 3

3

別の結合を支持して、サブクエリに反対することをお勧めします (それらははるかに高価です)。この 2 番目の結合は、dept テーブルから、部門マネージャー ID の従業員の Employee ID の emp テーブルに戻ります。

(わかりやすくするために列のエイリアスを追加しました-それらはまったく必要ありません)

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 Subquery linkについて議論している良いスレッドがあります。

于 2012-10-29T18:29:35.430 に答える
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

于 2012-10-29T18:28:00.487 に答える
0

select句で

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

部門 ID でフィルタリングする必要があります。

このままでは、すべての部門のすべてのマネージャーが返されますか?

于 2012-10-29T18:24:57.927 に答える