考虑使用以下简单模式的关系Book
Book(title, pages)
我想找到页数最多的图书的标题, 但不使用子查询。
这可能吗?
编辑:这不适用于特定的DBMS。我正在学习一本书(使用SQL-99标准),这是练习的一部分。
答案 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
答案 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;
如果两本书的最大页数相同,那么这只会显示其中一本,而其他两种解决方案都会显示两者。