0

問題のない次のクエリがあります。

SELECT m.movie_name, cd.times_requested
FROM movie m,
  (select *
  from(
    select movie_id, count(movie_id) as times_requested
    from movie_queue
    where status_id=0 or status_id=1
    group by movie_id
    ) ab
  where times_requested>1) cd
WHERE m.movie_id=cd.movie_id;


次のリストを返します。

MOVIE_NAME                                            TIMES_REQUESTED
----------------------------------------------------------------------
E.T. the Extra-Terrestrial                                    2 
Indiana Jones and the Kingdom of the Crystal Skull            2 
War of the Worlds                                             3 
Unbreakable                                                   3 


質問:
各映画に利用可能な DVD の量を示す別の列を追加するにはどうすればよいですか?

上の表は問題ありませんが、3 番目の列を追加したいと思います。3 番目の列には、各映画で利用可能な DVD の数に関する情報が含まれます。問題は、DVD の数が別のテーブル コール DVDS に格納されていることです。テーブル DVD の構造は次のようになります。

    DVD_ID   MOVIE_ID DVD_ENTRY_DATE
---------- ---------- --------------
         1          1 24-JUL-12      
         2          1 24-JUL-12      
         3          1 24-JUL-12      
         4          2 24-JUL-12      
         5          2 24-JUL-12   

望ましい結果:
最終的なテーブルは次のようになります。

MOVIE_NAME                         TIMES_REQUESTED   DVDS_AVAILABLE
-------------------------------------------------------------------
E.T. the Extra-Terrestrial               2               3
Indiana Jones and the Kingdom            2               1
War of the Worlds                        3               3
Unbreakable                              3               1



次のコードを試しましたが、望んでいた結果が得られませんでした。
最初に DVD テーブルに移動し、必要な movie_id に一致するすべての DVD を見つけて、movie_id でグループ化する必要があると想定しています。以下のコードを試してみましたが、必要な 4 行を返す代わりに 72 を返しています。

SELECT m.movie_name, pomid.times_requested, d.dvds_available
FROM movie m,
  (select *
  from(
    select movie_id, count(movie_id) as times_requested
    from movie_queue
    where status_id=0 or status_id=1
    group by movie_id
    ) mid
  where times_requested>1) pomid, 
  (select movie_id, count(movie_id) as dvds_available
   from dvd
   group by movie_id) d
WHERE m.movie_id=pomid.movie_id;


これを修正する方法についてご提案いただきありがとうございます。

4

2 に答える 2

1

d.movi​​e_id への結合が欠落しているため、取得する行が多すぎます。(簡単なチェック: テーブルはいくつありますか? 結合はいくつありますか?)

また、dvd または movie_queue エントリがない場合でも、すべてのムービーを取得するために外部結合を追加します。

SELECT m.movie_name
      ,NVL(pomid.times_requested,0) times_requested
      ,NVL(d.dvds_available,0) dvds_available
  FROM movie m
      ,(SELECT *
          FROM (SELECT   movie_id
                        ,COUNT (movie_id) AS times_requested
                    FROM movie_queue
                   WHERE status_id = 0
                      OR status_id = 1
                GROUP BY movie_id) mid
         WHERE times_requested > 1) pomid
      ,(SELECT   movie_id
                ,COUNT (movie_id) AS dvds_available
            FROM dvd
        GROUP BY movie_id) d
 WHERE m.movie_id    = pomid.movie_id(+)
   AND d.movie_id(+) = pomid.movie_id;

http://www.sqlfiddle.com/#!4/5437a/11

于 2012-07-25T06:31:50.263 に答える
0

テーブル構造を本当に理解しているかどうかはわかりませんが、これで始められるかもしれません:

select movie_id, 
       sum(case when status_id in (0,1) then 1 else 0 end) as times_requested,
       count(movie_id) as dvd_available,
from movie_queue
group by movie_id;
于 2012-07-24T21:55:47.457 に答える