SQL子查询大于/小于运算符

时间:2019-05-06 04:00:19

标签: sql oracle subquery

我目前正在尝试通过jobname函数简单地查询jobidGROUP BY。我使用COUNT(jobID) >2进行子查询。尽管如此,输出仍显示2的值。我知道我可以对此使用HAVING,但是我真的对为什么它不起作用感兴趣。

SELECT EmployeeType.jobName, COUNT(Employee.JobID) FROM Employee, EmployeeType WHERE (Employee.jobID = EmployeeType.jobID) AND (SELECT COUNT(Employee.jobID) FROM Employee) > 2 GROUP BY EmployeeType.JobName;

输出: enter image description here

2 个答案:

答案 0 :(得分:3)

您的子查询与外部查询没有任何关系。当执行该子查询时,它仅查询SELECT COUNT(Employee.jobID) FROM Employee来评估每个记录。该查询的值大于2,因此每条记录都会包括在内。

如果我了解您要执行的操作,则应该只使用HAVING子句。

SELECT EmployeeType.jobName, COUNT(Employee.jobID)
FROM Employee, EmployeeType
WHERE Employee.jobID = EmployeeType.jobID
GROUP BY EmployeeType.JobName
HAVING COUNT(Employee.jobID) > 2

答案 1 :(得分:1)

并不是迈克尔的答案是错误的,但是应该完全避免在FROM子句中使用逗号。因此,我提供了其他答案。

首先,在21世纪编写查询的正确方法是:

SELECT et.jobName, COUNT(*)
FROM Employee e JOIN
     EmployeeType et
     ON e.jobID = et.jobID
GROUP BY et.JobName
HAVING COUNT(e.jobID) > 2;

还请注意表别名的使用。

如果JobNameEmployeeType 中是唯一的,则可以使用相关子查询:

select et.jobName,
       (select count(*)
        from employee e
        where e.jobId = et.jobId
       ) as cnt
from employeeType;

然后,您将使用子查询来过滤所需的计数。