2015-03-17 2 views
0

Я смог успешно использовать cte с ниже SQL, который содержит ранжирование, которое дает мне вывод.Может ли SQL Server ограничить результаты запросом на основе ранга без использования 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?

+1

Я думаю, вы также имеете в виду без подзапроса, не так ли? – dario

+1

Вы можете сделать это с подзапросом - но по существу, это то же самое, что и –

+1

, вместо этого вы можете использовать производную таблицу, но это то же самое. Начиная с SQL Server 2012, вы можете использовать 'ORDER BY ... FETCH' – Lamak

ответ

-1

Вы можете использовать OUTER APPLY как коррелированный подзапрос. Это также называется объединением или представлением LATERAL в некоторых РСУБД (Oracle, PostgreSQL). Он выглядит как 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. Он не форматирует меня хорошо, но, похоже, это хорошая статья.

Смежные вопросы