1

以下は、特定の映画の最低価格とそれを販売する配給会社を見つけるために作成したクエリです。すべての映画が、販売する配給会社と一緒にそれぞれの最高の映画価格でリストされるように操作するにはどうすればよいですか。それ?

/*finds the cheapest price for the movie "American Beauty" and the distributor who sells it*/
SELECT movies.title, movie_distributors.distributor_name, MIN(distributed_movie_list.unit_price) AS lowest_price 
FROM distributed_movie_list 
INNER JOIN movies ON distributed_movie_list.movie_id = movies.movie_id 
INNER JOIN movie_distributors ON movie_distributors.distributor_id = distributed_movie_list.distributor_id 
WHERE movies.title = 'American Beauty' 
AND distributed_movie_list.unit_price = 
    (SELECT MIN(unit_price) 
    FROM distributed_movie_list 
    INNER JOIN movies ON distributed_movie_list.movie_id = movies.movie_id 
    WHERE movies.title = 'American Beauty') 
GROUP BY movies.title, distributed_movie_list.distributor_id, movie_distributors.distributor_name;

このクエリには、次の表が使用されます。

create table movies (
movie_id              number(5),
title                 varchar2(30) not null,
category_code         char(3) not null,
description           varchar2(500),
released_by           number(3) not null,
released_on           date not null
);

create table movie_distributors(
distributor_id      number(3),
distributor_name    varchar2(30) not null,
location            varchar2(40),
contact             varchar2(40)
);

create table distributed_movie_list(
distribution_id           number(8),
movie_id                  number(5) not null,
distributor_id            number(3) not null,
distribute_type           varchar2(10),
inventory_quantity        number(3) default 0,
unit_price                number(8,2)
);

私が探している最終結果は、各映画の配給業者と最高価格を一覧表示するクエリです。どんな助けでも大歓迎です; )。

4

3 に答える 3

2

私が探している最終結果は、各映画の配給業者と最高価格をリストするクエリです

それでは、なぜそうではないのですGROUP BY title, distributor_nameMAX

SELECT 
  m.movie_id,
  m.title,
  md.distributor_name, 
  MAX(d.unit_price) AS Highest_price 
FROM distributed_movie_list   AS d
INNER JOIN movies             AS m  ON d.movie_id        = m.movie_id 
INNER JOIN movie_distributors AS md ON md.distributor_id = d.distributor_id 
GROUP BY m.movie_id,m.title,
         md.distributor_name
HAVING MAX(d.unit_price) = (SELECT MAX(d2.unit_price)
                            FROM  distributed_movie_list d2
                            WHERE m.movie_id = d2.movie_id)
于 2013-02-01T18:29:10.610 に答える
1

以下は、ほとんどの RDBMS で機能するはずです。

SELECT DISTINCT m.title, md.distributor_name, dml.unit_price AS highest_price 
FROM distributed_movie_list dml
INNER JOIN movies m ON dml.movie_id = m.movie_id 
INNER JOIN movie_distributors md ON md.distributor_id = dml.distributor_id 
INNER JOIN (SELECT movie_id, MAX(unit_price) 
            FROM distributed_movie_list
            GROUP BY movie_id) dmlh
        ON dml.unit_price = dmlH.unit_price AND dml.movie_id = dmlh.movie_id

ランキング機能をサポートする RDBMS (Oracle や SQLServer など) では、より効率的なソリューションが可能です。

于 2013-02-01T18:59:06.190 に答える
1

各映画の最高価格 (および関連情報) を取得しようとしている場合は、row_number()関数を使用します。次のクエリは、各映画の最高価格に関するすべての情報を返します。

select dml.*
from (select dml.*,
             ROW_NUMBER() over (partition by movie_id order by unit_price desc) as seqnum
      from distributed_movie_list dml 
     ) dml
where seqnum = 1

映画や配給会社について知りたいその他の情報に参加できます。

于 2013-02-01T18:59:12.747 に答える