Oracle SQL使用“行内视图”从不同表中选择最高值

Oracle SQL使用“行内视图”从不同表中选择最高值,oracle,inline,highest,Oracle,Inline,Highest,我有一个数据库,包含prod_group和product两个表中的产品信息。有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,

我有一个数据库,包含prod_group和product两个表中的产品信息。有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;
上面代码的问题是,尽管我使用了不同的产品,但打印出来的4个产品是整个数据库中最昂贵的4个产品,而不是4个产品组中每个产品组最昂贵的

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

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

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;
SQL是关于获取什么数据,而不是如何获取数据。因此,要求使用特定技术编写查询是不常见的。所以我猜是老师问你这个?但接下来:您使用的是一种20多年前被取代的旧联接语法。我想现在再也没有老师教你了

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

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

select *
from product where (group_id, price) in
(
  select group_id, max(price)
  from product
  group by group_id
);
不过,这并不使用派生表,但可以使用上述方法重新编写。但是,我们可以用join替换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;
另一种方法是使用analytic MAX函数,这也将避免必须从同一个表中选择两次:

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

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

感谢这一非常干净的解决方案!呃,我看不出这是如何选择每一组最贵的产品,或者任何产品。我也没有看到任何内联视图。