Использование:
SELECT full_table.a,
full_table.b,
full_table.c
FROM (SELECT ...,
RANK() OVER (ORDER BY ratio DESC) AS rank
FROM Sub Query---) full_table
WHERE full_table.rank = 1
Не ясно, может ли быть возвращено более одной записи, поэтому я использовал RANK()
вместо ROW_NUMBER()
, потому что ROW_NUMBER
вернет только одну запись.
Вы можете включить это в предложение WITH
, но это все же один проход по производному табличному / встроенному представлению по сравнению с вашими двумя проходами ...
Oracle 9i + поддерживает синтаксис WITH
, вызываяэто "Подзапрос Факторинг".Те, кто пришел из SQL Server 2005+, знают синтаксис WITH
как общее табличное выражение (CTE).В отличие от реализации SQL Server, синтаксис WITH
в Oracle 9i - 11g является не рекурсивным - Oracle только добавил рекурсивную поддержку WITH (теперь это ANSI) в 11g R2, частично из-за поддержки Oracle рекурсивной функциональностисинтаксис CONNECT BY
(поддерживается начиная с Oracle v2).Синтаксис WITH
является синтаксическим сахаром для производных таблиц / встроенных представлений - план запроса не используется повторно для каждого экземпляра.
WITH full_table AS (
SELECT...)
SELECT x.a, x.b, x.c
FROM full_table x
JOIN (SELECT MAX(t.ratio) AS max_ratio
FROM full_table t) y ON y.max_ratio = x.ratio
... идентичен использованию:
SELECT x.a, x.b, x.c
FROM (SELECT ...) x
JOIN (SELECT MAX(t.ratio) AS max_ratio
FROM (SELECT ...) t) y ON y.max_ratio = x.ratio