选择与聚合函数匹配的行而不使用子查询

时间:2017-04-19 03:36:01

标签: sql postgresql

以下查询:SELECT * FROM products WHERE price > (SELECT AVG(price) FROM products)选择价格高于平均水平的所有产品。

是否可以使用聚合函数以某种方式而不是子查询(嵌套SELECT)或公用表表达式(WITH)来执行此操作。

我主要询问Postgres,但MySQL或SQL Server也有帮助。

SELECT * FROM products HAVING price > AVG(price)这样的东西,它不起作用。

4 个答案:

答案 0 :(得分:0)

我认为答案是肯定的。

还有一行,因为答案必须至少为30个字符。

答案 1 :(得分:0)

我们可以使用内连接来实现这些。 检查以下查询。

SELECT p1.* FROM products P1
inner join (SELECT AVG(price)as price FROM products) P2 on P1.price > P2.price

答案 2 :(得分:0)

此解决方案的派生表只是能够在列别名上应用where条件的语法糖:

select *
from (
  select p.*, 
         avg(price) over() as avg_price
  from products
) t
where price > avg_price;

答案 3 :(得分:0)

将平均结果存储在变量中,并在主查询中或任何需要的地方使用该变量。

DECLARE @avgPrice DECIMAL(5,2);
SET @avgPrice = (SELECT AVG(price) FROM products);
SELECT * FROM products WHERE price > @avgPrice;