我有一个包含两个表格中的产品信息的数据库" 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种产品组中最昂贵的产品。
答案 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
答案 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
子句中。我们必须在子查询中使用它,并将条件放在外部查询中。