SQL查询 - 查找没有子查询的属性的最大值

时间:2016-06-18 16:26:23

标签: sql greatest-n-per-group

考虑使用以下简单模式的关系Book

Book(title, pages)

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

这可能吗?

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

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

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

select top

答案 2 :(得分:0)

这通常使用窗口函数

来解决
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。您也可以重写它以使用公用表表达式:

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;

如果您认为派生表或公用表表达式是“子查询”,那么(在标准SQL中)您也可以限制行数:

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

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