【发布时间】:2019-06-17 20:22:22
【问题描述】:
考虑下表:
Company BuildYear ProductName Cost
------ ----------- ----------- ----
Foo 1900 A_1 50
Foo 2000 B_1 50
Foo 2000 B_2 50
Bar 1900 A_1 50
Bar 1900 A_2 100
Bar 2000 B_1 50
查询 #1(简单):
我们正在寻找在 1900 年只生产一种产品的公司。在上面的示例中,只有Foo 公司拥有 A_1 产品(Bar 公司生产两种不同类型的产品,即 A_1 和 A_2)
为此,查询将是:
SELECT *
FROM Table
WHERE BuildYear=1900
GROUP BY ProductName
HAVING COUNT(*) = 1
查询 #2(我的问题):
现在我们正在寻找在 1900 年只生产一种产品,并且这种产品的成本低于 75 美元的公司。对于上面的示例表,答案还是只有Foo 公司。
不用说,只需将AND cost<75 添加到上述查询中就会返回错误的答案(Foo 和Bar)。将其添加到 HAVING 子句也会引发以下错误消息:
“成本”列必须出现在 GROUP BY 子句中或用于聚合函数中
另一方面,我不希望将上述查询的结果再次与原始表连接(如果可能),因为该表实际上很大。
任何反馈都将不胜感激。
更新: 上面显示的列仅用于演示,在实际表中它们都是 TEXT(因此 MIN/MAX 技巧不适用)
更新:为什么将AND cost<75 添加到WHERE 子句不起作用?因为该子句切断了Bar::A_2 产品,并且在之后HAVING 进行评估时,它认为Bar 是一家只有一种产品的公司。
【问题讨论】:
-
不确定我是否了解所有内容,但您不应该简单地在 where 子句中包含
and cost < 75吗?顺便说一句,在我看来,Foo 在 1900 年确实有两行。 -
我修正了后一点。我会详细说明为什么一个简单的并且不能在一分钟内工作。
标签: sql postgresql performance