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
それをサブクエリで使用し、条件を外側のクエリに入れる必要があります。