火鸟集团条款

  • 本文关键字:火鸟 sql firebird
  • 更新时间 :
  • 英文 :


我无法理解火鸟群逻辑

查询:

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)具有不同的值。如果尝试同时选择idname列,则会直接与一个组只能有一行的约束相矛盾。这就是为什么您不能选择除了组键之外的任何字段。

对于聚合函数,则有所不同。这是因为,当对值求和或计数或获得最大值时,基本上只基于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

相关内容

  • 没有找到相关文章

最新更新