0

「prod_group」と「product」の 2 つのテーブルに製品情報を含むデータベースがあります。複数の製品を含む 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;

上記のコードの問題は、「個別」を使用しても、印刷された 4 つの製品がデータベース全体で最も高価な 4 つの製品であり、4 つの製品グループのそれぞれで最も高価ではないことです。

4

3 に答える 3

0

SQL は、どのようにデータを取得するかではなく、どのデータを取得するかがすべてです。そのため、特定の手法を使用してクエリを作成するよう求められることはめったにありません。したがって、これは先生があなたに尋ねているのではないでしょうか? ただし、20 年以上前に置き換えられた古い結合構文を使用しています。もうそんなことを教えてくれる先生はいないと思います。

インラインビューは、現在一般に派生テーブルFROMと呼ばれるもの、つまり句内のサブクエリの古い Oracle 名です。派生テーブルを使用してクエリを作成するのは奇妙な要求です。なぜなら、任意のクエリを次のような形式に変換できるからですselect * from (<some query here>)

製品グループで最も価格が高い製品を取得するよう求められます。2 つのテーブルがありますが、必要なすべてのデータ (製品とそのグループ) は、そのうちの 1 つである table にあります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;

もう 1 つの方法は、分析MAX関数を使用することです。これにより、同じテーブルから 2 回選択する必要がなくなります。

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

ここでは、必要な節に分析関数を配置できないため、派生テーブルも必要です。WHEREそれをサブクエリで使用し、条件を外側のクエリに入れる必要があります。

于 2015-09-16T19:18:13.177 に答える
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

SQLフィドル

于 2015-09-16T15:14:56.450 に答える