加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

有没有办法让这个SQL更有效率?

发布时间:2020-12-12 16:25:58 所属栏目:MsSql教程 来源:网络整理
导读:请考虑以下表格: 部 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和deptn
请考虑以下表格:

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是因为一旦计数完成,我们就已经知道了

>员工存在>部门存在

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读