【问题标题】:Basic SQL Queries - retrieve set based on foreign key基本 SQL 查询 - 基于外键检索集合
【发布时间】:2014-06-10 01:26:41
【问题描述】:

所以我是 SQL 查询的新手,并且正在练习一些基本的查询 - 不幸的是,我似乎被困在一个查询上,并认为我会询问如何限制我的结果。

首先,问题:

List departments that have more than one position.

我有一个职位表和一个部门表。

位置表列:

 posid (positions ID), DeptID (foreign key)

部门表列:

Dept_Id (key), Dept_name 

我目前有以下查询:

SELECT D.Dept_name, P.posid 
FROM DB.positions P INNER JOIN DB.dept D 
ON P.DeptID = D.Dept_Id 
ORDER BY D.Dept_name;

使用以下返回集:

    Dept_name   posid
1   HR          102
2   HR          105
3   IT          109
4   IT          101
5   IT          110
6   Receiving   103
7   Receiving   106
8   Sales       108
9   Sales       107
10  Sales       104

如您所见,HR 有两个不同的职位,IT 有 3 个等。

想要我的返回结果然后列出只是以下内容:

HR
IT
Receiving
Sales

我怎样才能退回这组?我知道我可以使用 COUNT - 但我不知道如何让它与这个返回集一起使用,或者如何进行嵌套子查询(记住,我正在学习,这周才开始......)

【问题讨论】:

    标签: sql return subset


    【解决方案1】:
    SELECT D.Dept_name
    FROM DB.positions P INNER JOIN DB.dept D 
      ON P.DeptID = D.Dept_Id 
    GROUP BY D.Dept_name
    HAVING COUNT(*) > 1
    ORDER BY D.Dept_name;
    

    HAVING 子句只会返回超过 1 个职位的部门。

    【讨论】:

    • 但这不只是计算Dept_names的数量吗?我正在专门寻找职位数量。那么这会是 HAVING COUNT(P.posid) > 1 吗?
    • 运行它,你会看到它只返回超过 1 个位置的部门的行。
    • 运行它会导致错误:选定的非聚合值必须是关联组的一部分。
    • HAVING COUNT(*) 仅表示根据GROUP BY 标准对多少行进行分组。当您在没有 GROUP BY 的情况下运行查询时,您可以看到 count(*) 代表多少行。
    • 好的。听起来我的误解或缺乏知识属于 GROUP BY 类别。我会去阅读更多。不过,您的回答是有道理的-尤其是在这种解释下。谢谢!
    【解决方案2】:

    阅读分组方式

    您的查询应该是这样的

    SELECT D.Dept_name
    FROM DB.positions P INNER JOIN DB.dept D 
         ON P.DeptID = D.Dept_Id 
    Group By D.Dept_name
    Having count(P.posid ) > 1
    Order By D.Dept_name;
    

    这与此处发布的其他答案相同

    【讨论】:

      猜你喜欢
      • 2015-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-01
      • 2012-10-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多