首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL Select语句重复

SQL Select语句重复
EN

Stack Overflow用户
提问于 2013-12-08 23:54:55
回答 5查看 83关注 0票数 0

我有三个SQL表(Movies、MovieCopy和RentalTransactions)。Movies保存有关电影的数据,MovieCopy保存与特定DVD等的副本数量相关的数据,并用作电影和RentalTransactions之间的关联实体,RentalTransactions保存有关电影租赁的数据。

电影有10行数据(Movie1、Movie2、Movie3等,最多10行)。MovieCopy有30行,这30行由电影表格中的10部电影中的每一部电影的3个副本组成。RentalTransactions有10行,与MovieCopy中的前10行相关。

我正在尝试运行一个报告,它将显示所有'DVD‘类型的电影,这些电影目前没有借出,所以这将是MovieCopy表中剩余的20个电影副本。

下面是我的SQL代码,试图拉取这个报告,但当我执行这个SQL时,我返回了290行,我不确定为什么会发生这种情况,理想情况下,我希望只看到MovieCopy中不在RentalTransactions中的20行。

代码语言:javascript
复制
Select Movies.Movie_Name, Movies.Movie_Type, 
    Movies.Movie_Medium, Count(MovieCopy.Movie_CopyID) as Copies 
FROM Movies,MovieCopy,RentalTransactions 
WHERE Movies.Movie_Medium = 'DVD' and Movies.MovieID = MovieCopy.MovieID 
    and MovieCopy.Movie_CopyID <> RentalTransactions.Movie_CopyID;

有人能看出我的错误吗?

EN

回答 5

Stack Overflow用户

发布于 2013-12-09 00:04:53

代码语言:javascript
复制
Select Movies.Movie_Name, Movies.Movie_Type, 
    Movies.Movie_Medium, Count(MovieCopy.Movie_CopyID) as Copies 
FROM Movies,MovieCopy,RentalTransactions 
WHERE Movies.Movie_Medium = 'DVD' and Movies.MovieID = MovieCopy.MovieID 
    and MovieCopy.Movie_CopyID NOT IN (SELECT Movie_CopyID FROM RentalTransactions );
票数 0
EN

Stack Overflow用户

发布于 2013-12-09 00:04:54

使用NOT EXISTS从存在RentalTransactionsMovieCopy中删除所有行,使用GROUP BY获取每个电影的计数器。

代码语言:javascript
复制
Select
  Movies.Movie_Name, Movies.Movie_Type, Movies.Movie_Medium,
  Count(1) as Copies 
FROM Movies
JOIN MovieCopy ON ( MovieCopy.MovieId = Movies.MovieId )
WHERE Movies.Movie_Medium = 'DVD'
NOT EXISTS
(
  SELECT 1
  FROM RentalTransactions
  WHERE RentalTransactions.Movie_CopyID = MovieCopy.Movie_CopyID
)
GROUP BY
  Movies.Movie_Name, Movies.Movie_Type, Movies.Movie_Medium
票数 0
EN

Stack Overflow用户

发布于 2013-12-09 00:05:05

您的表结构错误。您正在使用RentalTransactions中存在的条目作为是否租用副本的标志。但是,当您执行查询时,这并不像您预期的那样工作。该查询将找到电影类型为'DVD‘的所有情况,并且在MovieCopy中具有对应的条目,但对于不是其本身的每个事务。这将创建重复项。

此外,这将强制您在每次有人返回电影副本时删除条目,这将破坏任何形式的历史记录。

您需要做的是在MovieCopy中创建一个新属性,并将其设置为true/false,这取决于副本是否是租用的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20455395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档