我有三个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行。
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;有人能看出我的错误吗?
发布于 2013-12-09 00:04:53
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 );发布于 2013-12-09 00:04:54
使用NOT EXISTS从存在RentalTransactions的MovieCopy中删除所有行,使用GROUP BY获取每个电影的计数器。
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发布于 2013-12-09 00:05:05
您的表结构错误。您正在使用RentalTransactions中存在的条目作为是否租用副本的标志。但是,当您执行查询时,这并不像您预期的那样工作。该查询将找到电影类型为'DVD‘的所有情况,并且在MovieCopy中具有对应的条目,但对于不是其本身的每个事务。这将创建重复项。
此外,这将强制您在每次有人返回电影副本时删除条目,这将破坏任何形式的历史记录。
您需要做的是在MovieCopy中创建一个新属性,并将其设置为true/false,这取决于副本是否是租用的。
https://stackoverflow.com/questions/20455395
复制相似问题