Как я могу использовать псевдоним внутри подзапроса? - PullRequest
3 голосов
/ 05 сентября 2010

Я пытаюсь получить строки с максимальным значением из таблицы следующего вида:

A | B | Ratio 
0 | 1 | 1.0
1 | 2 | 1.0
2 | 3 | 1.0
3 | 4 | 0.33
4 | 5 | 0.25

Я пытаюсь отобразить только строки, содержащие максимальное значение (в данном случае 1,0). Может быть, я не делаю это правильно. У меня есть запрос в форме:

SELECT A,B,C 
FROM (---Long Sub Query--- Aliased as Full_Table)
WHERE RATIO=(SELECT MAX(RATIO) FROM Full_Table);

Но на Full_Table нельзя ссылаться из второго подзапроса. Есть несколько строк с одинаковым максимальным значением, поэтому я использовал этот запрос. Есть ли лучшая конструкция для достижения этой цели? В худшем случае мне придется заменить второй Full_Table на весь длинный запрос, но я надеюсь, что есть лучший способ сделать это.

Ответы [ 2 ]

5 голосов
/ 05 сентября 2010

Вы можете использовать общее табличное выражение:

WITH Full_Table AS (---Long Sub Query---)
SELECT A,B,C 
FROM Full_Table
WHERE RATIO=(SELECT MAX(RATIO) FROM Full_Table);
2 голосов
/ 05 сентября 2010

Использование:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...