我正在使用Firebird SQL。下面提到的查询返回4行,如图所示。
SELECT a.EPS_ID,b.C_NAME,c.AY_YR_NAME,d.S_NAME,e.E_NAME
FROM
TBLEXAMPLANNER_S_MSB a,
TBLCLASS_MSB b,
TBLACADEMICYEAR_MSB c,
TBLSUBJECTS_MSB d,
TBLEXAMTYPE_MSB e
WHERE
a.EPS_CLASS_ID=b.C_ID
AND a.EPS_SESSION_ID=c.AY_ID
AND a.EPS_SUB_ID=d.S_ID
AND a.EPS_PE_ID=e.E_ID
我希望它只返回一行(如
)EPS_ID C_NAME AY_YR_NAME S_NAME E_NAME
---------------------------------------------------
7 5 2016-2017 English FA1
我正在使用以下查询,但它不起作用。
SELECT a.EPS_ID,MAX(b.C_NAME) AS XT,c.AY_YR_NAME,d.S_NAME,e.E_NAME
FROM
TBLEXAMPLANNER_S_MSB a,
TBLCLASS_MSB b,
TBLACADEMICYEAR_MSB c,
TBLSUBJECTS_MSB d,
TBLEXAMTYPE_MSB e
WHERE
a.EPS_CLASS_ID=b.C_ID
AND a.EPS_SESSION_ID=c.AY_ID
AND a.EPS_SUB_ID=d.S_ID
AND a.EPS_PE_ID=e.E_ID
GROUP BY a.EPS_ID,d.S_NAME
错误消息是:
选择列表中的表达式无效(不包含在 聚合函数或GROUP BY子句)
答案 0 :(得分:4)
GROUP BY
的使用使引擎组成为您的记录。要进行分组,您必须为RDBMS提供每个列的建议,以及它应该做什么。
GROUP BY-Clause
SUM(mycol)
此外:在您的情况下,您尝试按EPS_ID
分组,这在每行中都是唯一的。因此,该列的分组将返回所有行,因为没有任何内容可以分组。要对记录进行分组,他们必须具有相同的值。
答案 1 :(得分:0)
学习使用正确的,明确的JOIN
语法。
您的问题是所有未加聚合的列需要位于GROUP BY
:
SELECT a.EPS_ID, MAX(b.C_NAME) AS XT, c.AY_YR_NAME, d.S_NAME, e.E_NAME
FROM TBLEXAMPLANNER_S_MSB a JOIN
TBLCLASS_MSB b
ON a.EPS_CLASS_ID = b.C_ID JOIN
TBLACADEMICYEAR_MSB c
ON a.EPS_SESSION_ID = c.AY_ID JOIN
TBLSUBJECTS_MSB d
ON a.EPS_SUB_ID = d.S_ID JOIN
TBLEXAMTYPE_MSB e
ON a.EPS_PE_ID = e.E_ID
GROUP BY a.EPS_ID, c.AY_YR_NAME, d.S_NAME, e.E_NAME;
注意:我还建议您对表别名使用表缩写。因此,ep
代替TBLEXAMPLANNER_S_MSB
代替a
。任意表别名使查询很难遵循。
答案 2 :(得分:-1)
尝试
SELECT a.EPS_ID,c.AY_YR_NAME,d.S_NAME,e.E_NAME,MAX(b.C_NAME) AS XT ...
GROUP BY 1,2,3,4