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
这将获得每个组名的最贵价格:
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
子句中。我们必须在子查询中使用它,并将条件放在外部查询中。
我有一个数据库,其中包含两个表 "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
这将获得每个组名的最贵价格:
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
子句中。我们必须在子查询中使用它,并将条件放在外部查询中。