WHERE子句中的SQL无效标识符

时间:2016-11-27 00:17:49

标签: sql

我的数据库图表......

https://s13.postimg.org/4rqz9purr/image.jpg

我需要列出每位官员的姓名,他们报告的人数超过了官员报告的平均犯罪数量。

这是我的SQL ...

SELECT 
    last, first
FROM 
    officers 
JOIN 
    crime_officers USING (officer_id) 
JOIN 
    crimes USING (crime_id)
JOIN 
    crime_charges USING (crime_id)
WHERE 
    crime_charges > ALL (SELECT AVG(COUNT(*)) FROM crime_charges);

但是,我收到此错误:

  

第6行" crime_charges"

上的标识符无效

2 个答案:

答案 0 :(得分:2)

您的查询似乎已关闭。要获得每名警官(已报告犯罪)的平均犯罪数量:

SELECT COUNT(*) / COUNT(DISTINCT officer_id) 
FROM crime_officers ;

要获得超过平均值的官员,请使用HAVING条款:

select co.officer_id
from crime_officers co
group by co.officer_id
having count(*) > (select count(*) / count(distinct officer_id)
                   from crime_officers
                  );

您可以使用其他JOIN来引入其他列。

编辑:

获得官员姓名并不是那么难:

select co.officer_id, o.last, o.first
from crime_officers co join
     officers o
     on co.officer_id = o.officer_id
group by co.officer_id, o.last, o.first
having count(*) > (select count(*) / count(distinct officer_id)
                   from crime_officers
                  );

答案 1 :(得分:1)

此错误的原因是,在WHERE子句中,您使用了表名(crime_charges)而不是单个表达式。你应该用一个表达来代替一个官员报告的犯罪数量:

WHERE number_of_crimes_reported_by_an_officer >ALL (SELECT AVG(COUNT(*)) FROM crime_charges) ;

但是深入了解你的问题,你仍然远离正确的解决方案。如果请求的结果是一组人员,则您的查询应直接浏览人员表(没有其他联接),在WHERE子句中添加适当的条件。像这样:

SELECT last, first
FROM officers
WHERE (compute_number_of_crimes_reported_by_an_officer) >ALL (SELECT AVG(COUNT(*)) FROM crime_charges) ;

请参阅?通过这种方式,您将获得人员的列表。相反,如果您将连接添加到相关表,则不必要地增加记录数。