有没有办法通过将聚合函数的值与未包含在GROUP BY中的列进行比较来过滤查询结果?

时间:2016-08-09 22:38:53

标签: sql

我假设答案是否定的,但总是对学习新东西感兴趣。这是设置;我有三个表,container_location,container_location_size和容器。是的,还有位置表,但我不相信我需要它。 container_location是一个连接表,列出了给定位置的容器。容器表描述了给定容器的特征。 container_location_size描述了如何将容器放入某个位置。我可以使用此SQL获取给定位置的容器数量:

SELECT location_code,
       COUNT(*) AS container_count
  FROM container_location
GROUP BY location_code

我想回答的问题是哪些位置已满(即容器的数量等于或大于该位置的最大值.cocket_location_size表有一列max_containers,用于指定容器的容量。那个位置。我想出了这个SQL来回答这个问题:

SELECT container_location_size.location_code
  FROM container_location_size
  JOIN (SELECT location_code,
               COUNT(*) AS container_count
          FROM container_location
        GROUP BY location_code) AS contcount
    ON contcount.location_code = container_location_size.location_code
 WHERE contcount.container_count >= container_location_size.max_containers 

这有效,但我想知道这是否可以作为单个选择完成。我遇到的问题是HAVING要求所比较的任何列都在GROUP BY中。我显然不希望按容器的最大数量进行分组。就像我在开始时所说的那样,我认为这不是一个可以解决的问题,但我感兴趣的是要么被证明是错误的,要么是替代方法。

1 个答案:

答案 0 :(得分:1)

您可以将其写为:

SELECT l.location_code, COUNT(*) AS container_count
FROM container_location cl JOIN
     location l
     ON l.location_code = cl.location_code
GROUP BY l.location_code
HAVING COUNT(*) >= MAX(l.max_containers);

注意:

  • 这假定location(location_code)是唯一的。这似乎是合理的。
  • HAVING子句使用MAX(l.max_containers)。该列需要处于聚合函数中。
  • 另一种方法是在l.max_containers中加入GROUP BY
  • 这可能不会比你的版本快得多。