SQL Server 可以在不使用 cte 的情况下根据排名限制查询结果吗?

Posted

技术标签:

【中文标题】SQL Server 可以在不使用 cte 的情况下根据排名限制查询结果吗?【英文标题】:Can SQL Server limit results in query based on rank without using cte? 【发布时间】:2015-03-17 19:58:27 【问题描述】:

我已经能够成功地使用具有以下 SQL 的 cte,其中包含为我提供输出的排名。

WITH cte AS (
   SELECT foo, bar,
   rank() OVER(PARTITION BY foo ORDER BY bar) AS [rank]
   FROM baz)
select * from cte where [rank]=1

我的问题是不使用 cte 可以做到这一点吗?

【问题讨论】:

我猜你的意思也是没有子查询,不是吗? 您可以使用子查询来实现 - 但本质上是一样的 您可以改用派生表,但这也是一样的。从 SQL Server 2012 开始,您可以使用 ORDER BY...FETCH @Lamak ORDER BY ... OFFSET ... FETCH 并没有真正的帮助。这是greatest n per group 问题,不是窗口问题。 你能告诉我们你为什么不想使用 CTE... 特别是。如果它有效。它可以帮助我们提出一种替代方法。 【参考方案1】:

您可以使用OUTER APPLY 作为相关子查询。这在某些 RDBMS(Oracle、PostgreSQL)中也称为LATERAL 连接或视图。它看起来像 LEFT JOIN,但通常表现要好得多。

Real life example, when to use OUTER / CROSS APPLY in SQL

SELECT pr.name,
       pa.name
FROM   sys.procedures pr
       OUTER APPLY (SELECT TOP 2 *
                    FROM   sys.parameters pa
                    WHERE  pa.object_id = pr.object_id
                    ORDER  BY pr.name) pa
ORDER  BY pr.name,
          pa.name

该问题链接到带有several solutions for the "greatest N per group" problem 的文章。它的格式对我来说不太好,但它似乎确实是一篇好文章。

【讨论】:

以上是关于SQL Server 可以在不使用 cte 的情况下根据排名限制查询结果吗?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 公用表表达式(CTE)实现递归

如何在不使用 join 或 cte 的情况下在同一查询中使用动态生成的列

CTE 中的 SQL Server 视图导致性能不佳

在某些情况下,为什么CTE(公用表表达式)与SQL Server中的临时表相比会减慢查询速度

在 CTE 中创建块 - SQL Server

sql server使用cte递归查询获取树形的父节点/子节点