Oracle SQL select 来自不同表的最大值 "in line view"

Oracle SQL select highest values from different tables with "in line view"

我有一个数据库,其中包含两个表 "prod_group" 和 "product" 中的产品信息。有 4 个不同的产品组,其中包含多种产品。我应该使用 "in line view".

select 每个产品组中最昂贵的产品

我目前的代码:

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;

上面代码的问题在于,即使我使用 "distinct",打印出来的 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

SQLFiddle

这将获得每个组名的最贵价格:

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 名称,现在通常称为 derived table,即FROM 子句中的子查询。使用派生的 table 编写查询是一个奇怪的请求,因为您可以将任何查询转换为这样的格式:select * from (<some query here>).

系统要求您获取其产品组中价格最高的产品。有两个 table,但所有需要的数据(产品及其组)都在其中一个 table product 中找到。不需要从另一个 table prod_group select。典型的直接查询是:

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

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

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 函数,这也可以避免从同一个 table 中 select 两次:

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

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