我不明白这个SQL Server MIN()结果集

时间:2012-10-15 02:57:28

标签: sql sql-server tsql

我有这个SQL Server查询,我写信给找到RENTAL中记录数量最少的电影标题。

运行时,它返回的结果集与我自己执行子查询得到的结果集相同。

换句话说,相反,使用最小的RentalCount返回单个电影,它会返回所有电影标题及其相应的RentalCount。

SELECT B.Title, MIN(B.RentalCount) AS RentalCount
FROM (
    SELECT Movie.Title, Count(*) AS RentalCount
    FROM Rental
    JOIN Dvd ON Rental.RentalID=Dvd.DvdID
    JOIN Movie ON Dvd.Movieid=movie.MovieID
    GROUP BY Movie.Title
    ) B
GROUP BY B.Title

3 个答案:

答案 0 :(得分:3)

结果是正确的。您的子查询返回租赁表上每个标题的总计数。外部查询的结果也是一样的,因为你也按照标题对它们进行了分组。

后续问题:您想达到什么结果?

  

找到RENTAL表中记录数量最少的电影标题

SELECT Movie.Title, Count(*) AS RentalCount
FROM Rental
        JOIN Dvd ON Rental.RentalID=Dvd.DvdID
        JOIN Movie ON Dvd.Movieid=movie.MovieID
GROUP BY Movie.Title
HAVING Count(*) = 
    (
        SELECT MIN(t_count)
        FROM
        (
            SELECT Count(*) t_count
            FROM Rental
            GROUP BY Title
        ) a
    )

更新1

感谢 Martin Smith 向我介绍TOP....WITH TIES

SELECT TOP 1 WITH TIES Movie.Title, Count(*) AS RentalCount
FROM Rental
        JOIN Dvd ON Rental.RentalID=Dvd.DvdID
        JOIN Movie ON Dvd.Movieid=movie.MovieID
GROUP BY Movie.Title
ORDER BY RentalCount DESC

SQLFiddle Demo

答案 1 :(得分:0)

您可以在没有子查询的情况下完成此操作

SELECT TOP 1 Movie.Title, Count(*) AS RentalCount
FROM Rental
JOIN Dvd ON Rental.RentalID=Dvd.DvdID
JOIN Movie ON Dvd.Movieid=movie.MovieID
GROUP BY Movie.Title
ORDER BY Count(*) 

答案 2 :(得分:0)

如果您正在寻找特定的电影标题,那么请执行以下操作:

SELECT Movie.Title, Count(*) AS RentalCount
    FROM Rental
    JOIN Dvd ON Rental.RentalID=Dvd.DvdID
    JOIN Movie ON Dvd.Movieid=movie.MovieID
    where Movie.Title='xyz'
    GROUP BY Movie.Title