Oracle SQL使用"在行视图中选择来自不同表的最高值"

时间:2015-09-16 14:56:16

标签: oracle inline highest

我有一个包含两个表格中的产品信息的数据库" prod_group"和"产品"。有4个不同的产品组包含多种产品。我应该使用"在线视图"来选择每个产品组中最昂贵的产品。

到目前为止我的代码:

select *
from
(
select distinct pg.group_name, p.price most_expensive
from prod_group pg, product p
where pg.group_id = p.group_id
group by pg.group_name, p.price
order by p.price desc
)
where rownum < 5;

上面代码的问题在于即使我使用&#34; distinct&#34;打印出来的4种产品是整个数据库中最昂贵的4种产品,而不是4种产品组中最昂贵的产品。

3 个答案:

答案 0 :(得分:0)

select  pg.group_name, max(p.price) 
from prod_group pg, product p
where pg.group_id = p.group_id
group by pg.group_name
order by pg.group_name

SQLFiddle

答案 1 :(得分:0)

这将为每个组名提供最昂贵的价格:

select group_name,
       price AS most_expensive
from
(
  select pg.group_name,
         p.price,
         ROW_NUMBER() OVER ( PARTITION BY pg.group_name ORDER BY p.price DESC ) AS rn
  from   prod_group pg
         INNER JOIN
         product p
         ON ( pg.group_id = p.group_id )
)
where rn = 1;

答案 2 :(得分:0)

SQL是关于要获取的数据,而不是 来获取它。因此,要求使用特定技术编写查询并不常见。因此,我推测这是一位老师问你这个?但是后来:你使用的是二十多年前被替换的旧连接语法。我想,现在不再教老师了。

嗯,内联视图是现在通常称为派生表的旧Oracle名称,即FROM子句中的子查询。使用派生表编写查询是一个奇怪的请求,因为您可以将任何查询转换为这样的格式:select * from (<some query here>)

要求您获取产品组中价格最高的产品。有两个表,但所有需要的数据,产品及其组,都可以在其中一个表product中找到。无需从其他表prod_group中进行选择。典型的直接查询将是:

select *
from product where (group_id, price) in
(
  select group_id, max(price)
  from product
  group by group_id
);

但是,这不使用派生表,但可以使用上面给出的方法重写。但是,我们可以用连接替换IN子句,然后我们更自然地得到派生表:

select p.*
from product p
join 
(
  select group_id, max(price) as price
  from product
  group by group_id
) pmax on pmax.group_id = p.group_id and pmax.price = p.price;

另一种方法是使用分析MAX函数,这也可以避免必须从同一个表中选择两次:

select *
from
(
  select 
    p.*,
    max(price) over (partition by group_id) as maxprice
  from product p
)  
where price = maxprice;

这里我们甚至需要派生表,因为我们不能将分析函数放在我们希望拥有它的WHERE子句中。我们必须在子查询中使用它,并将条件放在外部查询中。