簡體   English   中英

有沒有辦法使此SQL更有效?

[英]Is there a way to make this SQL more efficient?

請考慮以下表格:

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)

編寫查詢以返回總人數為4或更多的那些部門的雇員的empname和deptname列。 記錄應按姓氏的字母順序返回

這是我的看法:

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. 該部門存在

試試這個查詢,它將正常工作。

select empname,deptname from employee,department
where 
employee.deptid=department.deptid and employee.deptid
in
(
  select deptId from employee group by deptid having count(*)>=4
) 
order by empname

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM