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 子句中。我们必须在子查询中使用它,并将条件放在外部查询中。