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 数量,我不能只是加入它,因为我需要先按 movie_id 对 DVD 进行分组?

上表没问题,但我想添加第三列,第三列将包含有关每部电影可用 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 回答