我无法理解火鸟群逻辑
查询:
SELECT t.id FROM T1 t
INNER JOIN T2 j ON j.id = t.jid
WHERE t.id = 1
GROUP BY t.id
工作完美
但当我尝试获得其他字段时:
SELECT * FROM T1 t
INNER JOIN T2 j ON j.id = t.jid
WHERE t.id = 1
GROUP BY t.id
我得到错误:Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause)
在查询中使用GROUP BY
时,指定的一个或多个字段将用作"键",数据行将根据这两个字段的唯一组合进行分组。在结果集中,每个这样的唯一组合都有一行,而且只有一行。
在您的情况下,组中唯一的标识符是t.id
。现在考虑一下,表中有2条记录,它们都具有t.id = 1
,但对于另一列(例如t.name
)具有不同的值。如果尝试同时选择id
和name
列,则会直接与一个组只能有一行的约束相矛盾。这就是为什么您不能选择除了组键之外的任何字段。
对于聚合函数,则有所不同。这是因为,当对值求和或计数或获得最大值时,基本上只基于id
字段执行该操作,而实际上忽略了其他列中的数据。因此,这是没有问题的,因为只有一个答案,比如说,对具有特定id的所有名称的计数。
总之,如果你想在结果中显示一列,你需要按它分组。然而,这会使分组更加精细,这可能是不可取的。在这种情况下,你可以这样做:
select * from T1 t
where t.id in
(SELECT t.id FROM T1 t
INNER JOIN T2 j ON j.id = t.jid
WHERE t.id = 1
GROUP BY t.id)
在SELECT
中使用GROUP BY
子句时,应仅使用GROUP BY
子句中列出的聚合函数或列。有关GROUP BY
子句的详细信息:http://www.firebirdsql.org/manual/nullguide-aggrfunc.html
例如:
SELECT Max(t.jid), t.id FROM T1 t
INNER JOIN T2 j ON j.id = t.jid
WHERE t.id = 1
GROUP BY t.id
SELECT * FROM T1 t
INNER JOIN T2 j ON j.id = t.jid
WHERE t.id = 1
GROUP BY t.id
这不会执行,因为您在groupby中使用了t.id,所以select子句中的所有列都应该使用聚合函数,否则这些列应该包含在groupby子句中。Select*表示您正在选择所有列,因此除t.id之外的所有列既不在groupby中,也不在aggregate函数中。
试试这个链接,如何在firebird 中使用GROUP BY