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
这通常使用 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
考虑具有以下简单模式的关系 Book
Book(title, pages)
我想找到页数最多的书名, 但不使用子查询。
这可能吗?
编辑:这不适用于特定的 DBMS。我正在学习一本书(使用 SQL-99 标准),这是练习的一部分。
select top (1) with ties title, pages
from books
order by pages desc
这通常使用 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