在庫 +--------------------+-------------------+---------------------- --+ | | DVD | 交換価格 | 在庫 | +--------------------+-------------------+---------------------- --+ | | 円周率 | パイ | 9.99 | 500 | | | 砂丘 | 29.99 | 100 | | | ヘザーズ | 4.99 | 20 | | | あご | ジョーズ 19.99 | 500 | | | マルホランド ドライブ | 39.99 | 50 | | | ウェイクライフ | 29.99 | 200 | +--------------------+-------------------+---------------------- --+ 借りた +-----------------+-----------------------+------------------+ | | 加入者 | queue_nbr | DVD | +-----------------+-----------------------+------------------+ | | ボブ | 1 | マルホランド ドライブ | | | ボブ | 2 | あご | ジョーズ | | チェイ | 1 | 円周率 | パイ | | | チェイ | 2 | ヘザーズ | | | ジェイミー | 2 | マルホランド ドライブ | | | ジェイミー | 4 | 砂丘 | | | ジェイミー | 1 | あご | ジョーズ | | ジェイミー | 3 | ウェイクライフ | | | ノラ | 4 | あご | ジョーズ | | ノラ | 2 | マルホランド ドライブ | | | ノラ | 3 | 砂丘 | | | ノラ | 1 | ウェイクライフ | +-----------------+-----------------------+------------------+
最も高価な映画のキューを持つサブスクライバーのみを返したいです (特定の時間に持っていたすべての映画を失った場合の Netflix DVD の交換費用を考えてください)。TOP、LIMIT、または ROWNUM ではなく MAX() を使用しました。これは、クエリが可能な限りデータベースに依存しないようにする必要があり、引き分けの場合に複数のサブスクライバーを返す必要があるためです。上記の表を使用すると、結果は次のようになります。
+---------+ | | 最高 | +---------+ | | ジェイミー | | | ノラ | +---------+
多くの検索と実験の後、機能するコードを思いつきましたが、コードの量と実行の両方で、初心者の目には肥大化して非効率的であるように見えます。
あなたのコードをリファクタリングして説明してくれる人はいますか?
私のコード:
SELECT z.subscriber highest
FROM
(SELECT MAX(price) max_price
FROM (
SELECT subscriber_name subscriber, SUM(replacement_price) price
FROM inventory i
INNER JOIN rented r
ON i.DVD = r.DVD
GROUP BY subscriber
) x
) y
INNER JOIN
(
SELECT subscriber_name subscriber, SUM(replacement_price) price
FROM inventory i
INNER JOIN rented r
ON i.DVD = r.DVD
GROUP BY subscriber
) z
ON z.price = y.max_price