为什么列中不包含列所需的列?

时间:2016-05-19 20:08:34

标签: sql

考虑以下设计的SQL语句:

SELECT e.job_title,
       CASE WHEN e.is_full_time = 'Y' THEN e.name || ' full time' ELSE e.name || ' part time' END,
       SUM(c.monterary_value)
FROM employee e
INNER JOIN car c ON c.employee_id = e.id
GROUP BY e.job_title,
         e.is_full_time,
         e.name;

为什么e.is_full_time是必需的,因为分组依据结果汇总而非汇总?

2 个答案:

答案 0 :(得分:2)

假设在您的数据中有两个具有相同名称但不同is_full_time值的记录 - 应该在select子句中评估哪一个?为了避免出现任何违规或推定的可能性,SELECT中的所有表达式都必须位于GROUP BY或聚合中。 某些系统会更灵活一点,例如,在组中选择 first 结果,或者任意选择一个,但大多数企业级数据库都会强制执行此要求。 / p>

避免使用不必要的GROUP BY表达式的一种方法是使用子查询:

SELECT e.job_title,
       CASE WHEN e.is_full_time = 'Y' THEN e.name || ' full time' ELSE e.name || ' part time' END,
       c.monterary_value
FROM employee e
INNER JOIN (
    SELECT employee_id, SUM(monterary_value) monterary_value 
    FROM car  
    GROUP BY employee_id ) c
  ON c.employee_id = e.id

答案 1 :(得分:0)

SQL在GROUP BY之前执行SELECT,所以如果它在SELECT子句中看到一个非聚合列,而GROUP BY子句中没有它,那么它抱怨。