Firebird集团条款

问题描述 投票:0回答:3

我无法理解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

我收到错误:

选择列表中的表达式无效(未包含在聚合函数或 GROUP BY 子句中)

sql firebird
3个回答
1
投票

当您在查询中使用

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)

1
投票

当您在

GROUP BY
中使用
SELECT
子句时,您应该仅使用
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

1
投票
SELECT * FROM T1 t 
INNER JOIN T2 j  ON j.id = t.jid 
WHERE t.id = 1
GROUP BY t.id

这不会执行,因为你在 group by 中使用了 t.id,所以 select 子句中的所有列都应该使用聚合函数,否则这些列应该包含在 group by 子句中。 Select * 表示您正在选择所有列,因此除 t.id 之外的所有列既不在 group by 中,也不在聚合函数中。

尝试此链接,如何在 firebird 中使用 GROUP BY

© www.soinside.com 2019 - 2024. All rights reserved.