Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对以下四个表使用联接的Sql命令_Sql - Fatal编程技术网

对以下四个表使用联接的Sql命令

对以下四个表使用联接的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 部门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_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)