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