sql - 有没有办法让这个 SQL 更高效?

标签 sql database performance

考虑下表:

部门

deptid      (type:INT)
deptname    (type: TEXT)
hours       (type:INT)
active      (type:BIT)

员工

empid       (type:INT)
empname     (type: TEXT)
deptid      (type: INT)
designation (type: TEXT)
salary      (type: INT)

编写一个查询以返回属于这些列的员工的 empname 和 deptname 列 人员总数为 4 人或以上的部门。记录应按 empname 的字母顺序返回

这是我的看法:

SELECT e1.empname, d.deptname from employee AS e1
FULL JOIN department AS d on e1.deptid = d.deptid
  WHERE e1.deptid IN(
    SELECT deptid FROM(
      SELECT e2.deptid, COUNT(e2.empid)
      FROM employee AS e2
      GROUP BY e2.deptid
      HAVING COUNT(e2.empid) >= 4
    )
  )
ORDER BY empname;

您将如何改进这一点?

最佳答案

这更短并且可能执行得更快

SELECT e1.empname, d.deptname
from (
      SELECT e2.deptid
      FROM employee AS e2
      GROUP BY e2.deptid
      HAVING COUNT(e2.empid) >= 4
    ) G
inner join employee AS e1 on e1.deptid = G.deptid
INNER JOIN department AS d on d.deptid = G.deptid
ORDER BY e1.empname;

从分组开始。您不需要内部查询中的 COUNT。 然后,加入两个表以获取名称。

使用 INNER JOIN 是因为一旦计数完成,我们就已经知道了

  1. 员工存在
  2. 该部门已存在

关于sql - 有没有办法让这个 SQL 更高效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5021993/

相关文章:

更新数据库中的表时出现 MySQLTransactionRollbackException

sql - 从年/月而不是日期字段中选择滚动日期范围

sql - 如何编写 SQL 查询来查找 Sql Server 2005 中哪些登录已被授予哪些权限?

sql-server - SQL Server 表简单选择查询花费的时间太长

mysql - 在 mysql 中有更好的方法吗? - 用另一个选择和分组更新整个列

sql - 额外的空列是否会显着影响 sql 表的大小?

php - PDO获取最后插入的ID

mysql - 如何制作将生成 SQL 的 HQL 以在一个语句中插入多个值?

c# - 为什么在这种情况下使用 AsParallel() 比 foreach 慢?

c# - ORA-00001 : unique constraint (SYSTEM. BROWSERS_PK) 违反