对以下四个表使用联接的Sql命令
有四张桌子 员工id、姓名、主管id 部门Id,姓名 Emp_非员工id,部门id Emp_saleemployee_id,工资对以下四个表使用联接的Sql命令,sql,Sql,有四张桌子 员工id、姓名、主管id 部门Id,姓名 Emp_非员工id,部门id Emp_saleemployee_id,工资 现在,我需要编写一个查询,显示每个部门获得最高工资的员工ID。我认为下面的方法应该可行。。 [已编辑] 为了显示员工姓名和部门名称,我将其设置得更为复杂 仅供员工ID使用 SELECT es.employee_id FROM emp_sal es INNER JOIN emp_dep ed ON ed.employee_i
现在,我需要编写一个查询,显示每个部门获得最高工资的员工ID。我认为下面的方法应该可行。。 [已编辑] 为了显示员工姓名和部门名称,我将其设置得更为复杂 仅供员工ID使用
SELECT
es.employee_id
FROM
emp_sal es
INNER JOIN emp_dep ed
ON ed.employee_id = es.employee_id
WHERE
es.salary = (
SELECT
max(iEs.salary)
FROM
emp_sal iEs
INNER JOIN emp_dep iEd
ON iEd.employee_id = iEs.employee_id
WHERE
iEd.department_id = ed.department_id
)
或者诸如此类的东西,除非您打算使用SQL=SQL Server,否则不要说您使用的是哪种类型的数据库。因此,这个解决方案对您不起作用。无论如何,它使用Oracle的分析函数RANK来解决这个问题 鉴于这些数据
SQL> select d.name
2 , e.name
3 , es.salary
4 from employee e join
5 emp_sal es on (es.employee_id = e.employee_id) join
6 emp_dep ed on (ed.employee_id = e.employee_id) join
7 department d on (d.department_id = ed.department_id)
8 order by d.department_id, es.salary desc
9 /
NAME NAME SALARY
---------- ---------- ----------
PRODUCTION GRINCH 1100
PRODUCTION CAT 1100
DELIVERY LORAX 3000
DELIVERY DAISY 2500
ACCOUNTS FOX 5000
ACCOUNTS KNOX 2500
ACCOUNTS SAM-I-AM 1200
7 rows selected.
SQL>
注意生产中的连接,这就是为什么返回四行
SQL> select dept_name
2 , emp_name
3 , salary
4 from (
5 select d.name as dept_name
6 , e.name as emp_name
7 , es.salary
8 , rank () over (partition by d.department_id
9 order by es.salary desc ) as rnk
10 from employee e join
11 emp_sal es on (es.employee_id = e.employee_id) join
12 emp_dep ed on (ed.employee_id = e.employee_id) join
13 department d on (d.department_id = ed.department_id)
14 )
15 where rnk = 1
16 order by salary desc
17 /
DEPT_NAME EMP_NAME SALARY
---------- ---------- ----------
ACCOUNTS FOX 5000
DELIVERY LORAX 3000
PRODUCTION GRINCH 1100
PRODUCTION CAT 1100
SQL>
编辑
我使用员工姓名而不是ID,因为这使结果更容易阅读。替换所需的投影仪非常容易。创建我自己的测试表:
DECLARE @Employee TABLE (Employee_id INT, Name VARCHAR(MAX), Chief_id INT)
DECLARE @Department TABLE (Department_Id INT, Name VARCHAR(MAX))
DECLARE @Emp_Dep TABLE (Employee_id INT, Department_Id INT)
DECLARE @Emp_Sal TABLE (Employee_id INT, Salary DECIMAL)
INSERT INTO @Employee
SELECT 1, 'John Doe', 0 UNION ALL
SELECT 2, 'John Doe', 0 UNION ALL
SELECT 3, 'John Doe', 0 UNION ALL
SELECT 4, 'John Doe', 0 UNION ALL
SELECT 5, 'John Doe', 0 UNION ALL
SELECT 6, 'John Doe', 0 UNION ALL
SELECT 7, 'John Doe', 0;
INSERT INTO @Department
SELECT 1, 'Moomin' UNION ALL
SELECT 2, 'Moo' UNION ALL
SELECT 3, 'Min';
INSERT INTO @Emp_Dep
SELECT 1, 1 UNION ALL
SELECT 2, 1 UNION ALL
SELECT 3, 2 UNION ALL
SELECT 4, 2 UNION ALL
SELECT 5, 3 UNION ALL
SELECT 6, 3 UNION ALL
SELECT 7, 3;
INSERT INTO @Emp_Sal
SELECT 1, 1200 UNION ALL
SELECT 2, 1100 UNION ALL
SELECT 3, 2000 UNION ALL
SELECT 4, 2000 UNION ALL
SELECT 5, 3451 UNION ALL
SELECT 6, 3321 UNION ALL
SELECT 7, 3123;
如果某个部门的所有人员都处于以下状态,则此版本将对他们进行更新:
WITH [Merged] AS (
SELECT [@Employee].[Employee_id],
[@Employee].[Name],
[@Department].[Name] [Department],
[@Department].[Department_Id],
[@Emp_Sal].[Salary]
FROM @Employee
INNER JOIN @Emp_Sal ON [@Employee].[Employee_id] = [@Emp_Sal].[Employee_id]
INNER JOIN @Emp_Dep ON [@Emp_Sal].[Employee_id] = [@Emp_Dep].[Employee_id]
INNER JOIN @Department ON [@Emp_Dep].[Department_Id] = [@Department].[Department_Id]
)
SELECT [Main].Employee_id, [Main].Name, [Main].Department, [Main].Salary
FROM Merged [Main]
WHERE [Salary] = (SELECT MAX(Salary) FROM [Merged] WHERE Department_Id = [Main].Department_Id);
虽然这个版本只会从每个部门中选择1个,但你必须找到一种方法,让你想要的人排在第一位
WITH [Merged] AS (
SELECT [@Employee].[Employee_id],
[@Employee].[Name],
[@Department].[Name] [Department],
[@Department].[Department_Id],
[@Emp_Sal].[Salary],
ROW_NUMBER() OVER(ORDER BY [@Department].[Department_Id] ASC, [@Emp_Sal].[Salary] DESC, [@Employee].[Employee_id] ASC) AS 'RowNumber'
FROM @Employee
INNER JOIN @Emp_Sal ON [@Employee].[Employee_id] = [@Emp_Sal].[Employee_id]
INNER JOIN @Emp_Dep ON [@Emp_Sal].[Employee_id] = [@Emp_Dep].[Employee_id]
INNER JOIN @Department ON [@Emp_Dep].[Department_Id] = [@Department].[Department_Id]
)
SELECT [Main].Employee_id, [Main].Name, [Main].Department, [Main].Salary
FROM Merged [Main]
WHERE [RowNumber] = (SELECT MAX(RowNumber) FROM [Merged] WHERE Department_Id = [Main].Department_Id);
值得一提的是,它是针对Microsoft SQL Server的 这将为您提供最高工资的价值:
SELECT
department_id, MAX(es.salary) AS max_salary
FROM
emp_sal es JOIN emp_dep ed ON ed.employee_id = es.employee_id
GROUP BY ed.department_id
这将为您提供以下ID:
SELECT department_id, employee_id, max_values.max_salary
FROM
emp_sal es JOIN emp_dep ed ON ed.employee_id = es.employee_id
JOIN
(SELECT
department_id, MAX(es.salary) AS max_salary
FROM
emp_sal es JOIN emp_dep ed ON ed.employee_id = es.employee_id
GROUP BY ed.department_id) AS max_values
ON (ed.department_id = max_values.department_id AND es.salary = max_salary)
如果存在联系,预期的行为是什么?i、 e.两名员工在给定部门的收入相同,这恰好是该部门的最高收入。添加了家庭作业标签,因为这是一个不费吹灰之力的gimme codez plz问题。这不会是因为在where中使用maxsalary毫无意义-充其量你可以得到整个表的最大值,我实际上认为它根本不会编译。事实上,它没有经过测试。我曾考虑过,但那也行不通。我已经添加了修改以使其生效。您不能选择employee_id,因为它既不是分组属性,也不是聚合函数
SELECT
department_id, MAX(es.salary) AS max_salary
FROM
emp_sal es JOIN emp_dep ed ON ed.employee_id = es.employee_id
GROUP BY ed.department_id
SELECT department_id, employee_id, max_values.max_salary
FROM
emp_sal es JOIN emp_dep ed ON ed.employee_id = es.employee_id
JOIN
(SELECT
department_id, MAX(es.salary) AS max_salary
FROM
emp_sal es JOIN emp_dep ed ON ed.employee_id = es.employee_id
GROUP BY ed.department_id) AS max_values
ON (ed.department_id = max_values.department_id AND es.salary = max_salary)