【问题标题】:HAVING clause which does not contain the attribute of the group by不包含分组属性的 HAVING 子句
【发布时间】:2023-03-15 05:57:02
【问题描述】:

使用 HAVING 子句而不提及 group by 中的属性是否正确? 例如:

select ncl 
from commande c, ligne_commande lc 
where c.nc = lc.nc
group by ncl
having count(nart) = ...

nart 属性未在 group by 中定义

【问题讨论】:

  • 我在 oracle 下工作。根据我从课程中了解到的情况,group by 子句将在 having 子句之前运行;所以分组然后从主表中提取 NCL 列并将其分组,那么如何对组中不存在的 NART 列的值进行一些过滤?
  • 你没有按nart分组,所以它自然不应该在分组中;更重要的是使用30-year old join syntax
  • select子句的属性必须在group by子句中指定;我发现这是合乎逻辑的,另一方面,基于相同的原则,我认为 group by 子句将创建一个具有单个列的虚拟表,在我们的示例 NCL 中,之后,将对包含的值应用过滤在唯一的列 NCL 中,跟随 groupby 的 HAVING 不会引用数据库中的主表,但它只会在 group by 子句定义的虚拟表上起作用......我想这是我的想法不正确:(
  • 它不是过滤 NART 的值,而是过滤该列上聚合函数的值。

标签: sql oracle


【解决方案1】:

having 子句中的术语必须是组的属性 - 即,您分组的列或聚合表达式。 count(nart) 是一个聚合项(组中非null nart 值的数量),因此在having 子句中是完全合法的。

【讨论】:

  • 如果我理解正确,当我将 HAVING 与聚合函数一起使用时,我可以指定 group by 子句中未指定的属性,另一方面,如果我在 HAVING 中不使用聚合函数, 然后我必须指定 group by 子句的属性 ... 我已经很好理解了吗?
  • @developjava 是的,没错
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-27
  • 2016-02-28
相关资源
最近更新 更多