2016-12-28 36 views
0

我已经创建了下面的查询,但是当我运行它时,我在GROUP BY子句中得到语法错误,但是当我删除它时,PostgreSQL给了我需要将t.bsn添加到GROUP BY子句的错误。我该如何解决这个错误?为什么我在群组中遇到语法错误?

SELECT t.bsn 
FROM teachers t, designes d, students s, course c, teaches lg 
WHERE c.course_follower = s.class AND t.bsn = lg.bsn AND d.course_code = c.course_code AND d.bsn = t.bsn AND s.class = lg.class 
HAVING t.salary = (2000 + (t.scale * 200) + ((t.scale - 10) * 300) + (100 * (COUNT(d.course_code) * (1.0 + (0.1 * COUNT(s.student_id)))) + (50 * c.amount_of_assignments))) 
GROUP BY t.bsn; 
+5

'集团BY'到来之前'HAVING'。但是,查询还存在其他大问题。您正在创建这四张表的笛卡尔积。作为一个经验法则,逗号应该永远不会被放在'FROM'子句中(这种做法现在已被弃用** 25年**)。改用显式的'JOIN'语法。 – Siyual

回答

1

根据SQL标准HAVING条款应该来GROUP BY;你的是之前。

代码:

SELECT 
     t.bsn 
FROM 
     teachers t, designes d, students s, course c, teaches lg 
WHERE 
     c.course_follower = s.class AND 
     t.bsn = lg.bsn AND 
     d.course_code = c.course_code AND 
     d.bsn = t.bsn AND 
     s.class = lg.class 
HAVING 
     t.salary = (2000 + (t.scale * 200) + ((t.scale - 10) * 300) + (100 * (COUNT(d.course_code) * (1.0 + (0.1 * COUNT(s.student_id)))) + (50 * c.amount_of_assignments))) 
GROUP BY 
     t.bsn; 

预计:

SELECT 
     t.bsn 
FROM 
     teachers t, designes d, students s, course c, teaches lg 
WHERE 
     c.course_follower = s.class AND 
     t.bsn = lg.bsn AND 
     d.course_code = c.course_code AND 
     d.bsn = t.bsn AND 
     s.class = lg.class 
GROUP BY 
     t.bsn 
HAVING 
     t.salary = (2000 + (t.scale * 200) + ((t.scale - 10) * 300) + (100 * (COUNT(d.course_code) * (1.0 + (0.1 * COUNT(s.student_id)))) + (50 * c.amount_of_assignments))); 

通用SQL实例 - http://www.w3schools.com/sql/sql_having.asp

PostgreSQL的SQL实例 - https://www.postgresql.org/docs/current/static/tutorial-agg.html

相关问题