【问题标题】:SQL Subquery greater than/less than operatorsSQL 子查询大于/小于运算符
【发布时间】:2019-05-06 04:00:19
【问题描述】:

我目前正在尝试通过GROUP BY 函数简单地查询jobnamejobid。我使用带有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;

输出:

【问题讨论】:

    标签: sql oracle subquery


    【解决方案1】:

    您的子查询与外部查询没有关系。执行该子查询时,它只查询 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
    

    【讨论】:

    • @Micheal,建议您使用ANSI JOIN syntax
    • 同意。如果我自己写这个,我会使用 INNER JOIN。我只是不想过多地改变 OP 的查询,以便专注于 HAVING 子句。
    • @Micheal Gunter,好的。明白了
    • @VenkataramanR:PSA:“迈克尔”不是一个名字。 :) (实际上,它是爱尔兰和苏格兰盖尔语中的一个名字,但 95% 以上的人会用这个名字拼写它。)
    • 知道了。对不起我的错字。我用谷歌搜索找到了迈克尔·杰克逊、迈克尔·乔丹 :)
    【解决方案2】:

    并不是迈克尔的回答是错误的,而是应该完全不鼓励在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;
    

    然后您将使用子查询来过滤您想要的计数。

    【讨论】:

    • 同意。如果我自己写这个,我会使用 INNER JOIN。我只是不想过多地改变 OP 的查询,以便专注于 HAVING 子句。
    猜你喜欢
    • 2015-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多