如何在没有子查询的情况下找到最大值

时间:2018-01-13 14:02:58

标签: sql sql-server tsql left-join correlated-subquery

为了获得以下结果集,我写了以下SQL:

Result Set

SELECT  t1.FilmName,
        t2.CountryName,
        t1.FilmRunTimeMinutes
FROM Film as t1
INNER JOIN country as t2 on t1.FilmCountryId = t2.CountryID
WHERE t1.FilmRunTimeMinutes = ( SELECT max(t2.FilmRunTimeMinutes) 
                                FROM film as t2 
                                WHERE t2.FilmCountryId = t1.FilmCountryId 
                              )
ORDER BY FilmRunTimeMinutes DESC

我读了这个Link并尝试了同样的方法,但我做不到。那么我怎样才能使用LEFT OUTER JOIN来获得相同的结果集?

电影表包含以下列:

FilmId --PK
FilmName 
FilmCountryId --FK
FilmRunTimeMinutes

国家表包含以下列:

CountryId --PK
CountryName

提前致谢。

2 个答案:

答案 0 :(得分:3)

使用Row_Number窗口函数

SELECT TOP 1 WITH ties t1.FilmName,
                       t2.CountryName,
                       t1.FilmRunTimeMinutes
FROM   Film AS t1
       INNER JOIN country AS t2
               ON t1.FilmCountryId = t2.CountryID
ORDER  BY Row_number() OVER(partition BY FilmCountryId ORDER BY FilmRunTimeMinutes DESC),
          FilmRunTimeMinutes DESC;

或使用CTE/Sub-Select

WITH cte
     AS (SELECT t1.FilmName,
                t2.CountryName,
                t1.FilmRunTimeMinutes,
                Rn = Row_number() OVER(partition BY FilmCountryId ORDER BY FilmRunTimeMinutes DESC)
         FROM   Film AS t1
                INNER JOIN country AS t2
                        ON t1.FilmCountryId = t2.CountryID)
SELECT *
FROM   cte
WHERE  Rn = 1
ORDER  BY FilmRunTimeMinutes DESC 

如果你真的希望left join接近

SELECT t1.FilmName,
       t2.CountryName,
       t1.FilmRunTimeMinutes
FROM   Film AS t1
       INNER JOIN country AS t2
               ON t1.FilmCountryId = t2.CountryID
       LEFT JOIN Film AS t3
              ON t3.FilmCountryId = t2.CountryID
                 AND t3.FilmRunTimeMinutes > t1.FilmRunTimeMinutes
WHERE  t3.FilmID IS NULL
ORDER  BY FilmRunTimeMinutes DESC 

答案 1 :(得分:-1)

试试这个

;WITH Q
AS
(
    SELECT
        RN = ROW_NUMBER() OVER(PARTITION BY t1.FilmCountryId ORDER BY t2.FilmRunTimeMinutes DESC),
        t1.FilmName,
        t2.CountryName,
        t1.FilmRunTimeMinutes
    FROM Film as t1
    INNER JOIN country as t2 on t1.FilmCountryId=t2.CountryID
    ORDER BY FilmRunTimeMinutes DESC
)
SELECT
    *
    FROM Q
        WHERE RN = 1