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

apr*_*urk 3 sql t-sql sql-server left-join correlated-subquery

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

结果集

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
Run Code Online (Sandbox Code Playgroud)

我阅读了此链接并尝试了相同的方法,但我做不到。那么如何使用 by 获得相同的结果集LEFT OUTER JOIN

电影表有这些列:

电影 ID --PK
影片名称 
电影国家 ID --FK
电影运行时间

Country表有这些列:

CountryId --PK
国家的名字

提前致谢。

Pரத*_*ீப் 5

使用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;
Run Code Online (Sandbox Code Playgroud)

或使用 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 
Run Code Online (Sandbox Code Playgroud)

如果你真的想要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 
Run Code Online (Sandbox Code Playgroud)