比较(<或>)一列的结果与两个select语句的另一列的结果? - 甲骨文

时间:2012-07-21 11:08:05

标签: oracle11g

问题:

如何比较(<或>)一列的结果与两个select语句的另一列的结果?

更多详情:

我只需要列出售完电影的清单。要做到这一点,我需要检查是否 第一个select语句中rented_movie_count上的数字等于或大于第二个select语句中available_movie_count上的数字。


第一声明

result of the 
select MOVIE_ID, count(MOVIE_ID) as rented_movies_count
from MOVIE_QUEUE
WHERE STATUS_ID=2
group by MOVIE_ID;


第二声明

select MOVIE_ID, count(MOVIE_ID) as available_movie_count
from dvd
group by MOVIE_ID;



我仍然很新,我正在努力学习,甚至建议什么样的 我应该使用的语法(运算符,表达式等)至少会指向我的方向来做更多的研究。提前致谢

1 个答案:

答案 0 :(得分:1)

鉴于您的数据库结构,可能的解决方案是

SELECT rented.MOVIE_ID
      ,rented_movies_count
      ,available_movie_count
  FROM (
        SELECT MOVIE_ID, count(MOVIE_ID) AS rented_movies_count
          FROM MOVIE_QUEUE
         WHERE STATUS_ID=2
        GROUP BY MOVIE_ID
       ) rented
     ,(SELECT MOVIE_ID, count(MOVIE_ID) AS available_movie_count
         FROM dvd
       GROUP BY MOVIE_ID
      ) available
 WHERE rented.movie_id = available.movie_id
   AND rented_movies_count >= available_movie_count 
;

我在http://www.sqlfiddle.com/#!4/3fc59/11上设置了一个示例进行测试。但我想这或多或少是你想出来的。

但我有点怀疑你的数据库结构真的是最优的!?您是否真的在表movie_id中为单dvd存储了多条记录?

movie_id中每个dvd只有一条记录以及一些电影属性并且将dvds的租借状态存储在movie_queue.status_id中会不会更有用吗?

如果将movie_queue.status_id定义为

  1. ...可用
  2. ...租
  3. 然后您的查询会更容易:

    SELECT MOVIE_ID
          ,count(case when status_id = 1 then 1 end) AS available_movie_count
          ,count(case when status_id = 2 then 1 end) AS rented_movies_count
      FROM MOVIE_QUEUE
     GROUP BY MOVIE_ID
    HAVING count(case when status_id = 2 then 1 end) >= count(case when status_id = 1 then 1 end)
    ;
    

    参见例如http://www.sqlfiddle.com/#!4/13739/1