SQL 查询 - 在没有子查询的情况下查找属性的最大值

SQL query - Finding the max value of an attribute without a subquery

考虑具有以下简单模式的关系 Book

Book(title, pages)

我想找到页数最多的书名, 但不使用子查询。

这可能吗?

编辑:这不适用于特定的 DBMS。我正在学习一本书(使用 SQL-99 标准),这是练习的一部分。

select top (1) with ties title, pages
from books  
order by pages desc

select top

这通常使用 window 函数解决

select title, pages
from (
  select title, pages, 
         dense_rank() over (partition by title order by pages desc) as rnk
  from books
) t
where rnk = 1;

然而以上是 SQL:2003 而不是 SQL99。您还可以重写它以使用常见的 table 表达式:

with ranked as (
   select title, pages, 
          dense_rank() over (partition by title order by pages desc) as rnk
   from books
)
select *
from ranked
where rnk = 1;

如果您考虑派生的 table 或常见的 table 表达式 "sub-query" 那么(在标准 SQL 中)您还可以限制行数:

select title, pages
from books
order by pages desc
fetch first 1 rows only;

如果两本书的最大页数相同,那么这将只显示其中的一本,而其他两个解决方案将同时显示。

有一个except。你找到所有有另一本页数更多的书(下部),然后你搜索除了那些书以外的所有书。

    select title,pages
      from books
   Except --minus if Oracle
   select b1.title,b1.pages
     from books b1 join books b2 
       on b1.pages < b2.pages