【问题标题】:Perform SELECT statement inside of SELECT Statement?在 SELECT 语句中执行 SELECT 语句?
【发布时间】:2020-02-26 18:53:15
【问题描述】:

我正在使用 Emp、Dept... 数据库。我想获得那些收入高于部门平均水平的员工的姓名、工资、部门编号和部门平均工资。所以这就是我想要做的:

SELECT e.Ename, e.Sal, e.Deptno
  , (
    SELECT AVG(Sal) 
    FROM Emp b 
    WHERE b.Deptno = e.Deptno
    GROUP BY Deptno
  ) AS 'Average Salary'
FROM Emp e
WHERE e.Sal > (
  SELECT AVG(b.Sal)
  FROM Emp b
  WHERE b.Deptno = e.Deptno
  GROUP BY Deptno
);

而且我不能使用AVG(Sal),因为它会给出员工的平均工资,而不是他工作的部门。

【问题讨论】:

    标签: sql sql-server tsql select


    【解决方案1】:

    您将使用相关子查询:

    SELECT e.Ename, e.Sal, e.Deptno,
           (SELECT AVG(e2.Sal) 
            FROM Emp e2
            WHERE e2.Deptno = e.Deptno
           ) AS [Average Salary]
    FROM Emp e
    WHERE e.Sal > (SELECT AVG(e2.Sal)
                   FROM Emp e2
                   WHERE e2.Deptno = e.Deptno
                  );
    

    但实际上,您只需使用窗口函数:

    select e.*
    from (select e.*, avg(sal) over (partition by deptno) as avg_sal
          from emp e
         ) e
     where sal > avg_sal;
    

    【讨论】:

      【解决方案2】:

      只要摆脱这个组。

      SELECT e.Ename, e.Sal, e.Deptno, (SELECT AVG(Sal) 
                                         FROM Emp b 
                                         WHERE b.Deptno = e.Deptno
                                         ) AS 'Average Salary'
      FROM Emp e
      WHERE e.Sal > (SELECT AVG(b.Sal)
                      FROM Emp b
                      WHERE b.Deptno = e.Deptno
                      );
      

      【讨论】:

        【解决方案3】:

        如果加入子查询,则无需重复。

        SELECT e.Ename, e.Sal, e.Deptno, dAvgs.avgSal AS 'Average Salary'
        FROM Emp AS e
        INNER JOIN (
           SELECT Deptno, AVG(b.Sal) AS avgSal
           FROM Emp b
           GROUP BY Deptno
        ) AS dAvgs
        ON e.Deptno = dAvgs.Deptno AND e.Sal > dAvgs.avgSal
        ;
        

        【讨论】:

          最近更新 更多