2012-05-18 5 views
2

У меня есть запрос, как:Сортировать по вновь выбранной колонке

SELECT 
    R.*  
FROM 
    (SELECT A, B, 
      (SELECT smth from another table) as C, 
    ROW_NUMBER() OVER (ORDER BY C DESC) AS RowNumber 
    FROM SomeTable) R 
WHERE 
    RowNumber BETWEEN 10 AND 20 

Это дает мне ошибку на ORDER BY C DESC.

Я понимаю, почему это вызвано ошибкой, поэтому я подумал о добавлении другого SELECT с ORDER BY и только, чем при выборе строки от 10 до 20. Но я не думаю, что это хорошо, чтобы иметь 3 вложенные SELECT команды.

Как еще можно выбрать эти строки?

+0

Я понимаю, подзапрос продуцирующие 'C' является коррелирует с тем, где вы пытаетесь сгенерировать номера строк. Если это так, вы можете попробовать преобразовать коррелированный подзапрос в один, к которому вы могли бы присоединиться. (Мое предположение: вам просто нужно использовать условие корреляции в качестве условия соединения, но я не могу быть уверен, не видя подзапроса и как он связан с другими частями всего запроса.) –

+0

Подзапрос выбирает счетчик из другая таблица с некоторым состоянием. – superM

+0

'... (SELECT sA, sB, aC, ROW_NUMBER OVER (ORDER BY aC DESC) FROM SomeTable s INNER JOIN (SELECT Key, COUNT (*) AS C FROM AnotherTable) a ON s.Key = c.Key) R ...' ? –

ответ

2

колонка не может ссылаться на псевдоним на том же уровне, вы должны стол- сначала выведите его или используйте CTE.

SELECT 
    R.* , ROW_NUMBER() OVER (ORDER BY C DESC) AS RowNumber  
FROM 
    (SELECT A, B, (SELECT smth from another table) as C 
    FROM SomeTable) R 
-- WHERE 
    -- but you still cannot do this 
    -- RowNumber BETWEEN 10 AND 20 

нужно сделать это:

select S.* 
from 
(
    SELECT 
     R.* , ROW_NUMBER() OVER (ORDER BY C DESC) AS RowNumber  
    FROM 
     (SELECT A, B, 
       (SELECT smth from another table) as C 
     FROM SomeTable) R 
) as s 
where s.RowNumber between 10 and 20 

Чтобы избежать глубокой вложенности и сделать это по крайней мере выглядеть приятным, используйте КТР:

with R as 
(
    SELECT A, B, (SELECT smth from another table) as C 
    FROM SomeTable 
) 
,S AS 
(
    SELECT R.*, ROW_NUMBER() OVER (ORDER BY C DESC) AS RowNumber 
    FROM R 
) 
SELECT S.* 
FROM S 
WHERE S.RowNumber BETWEEN 1 AND 20 
1

Вы не можете использовать псевдонимы столбцов в одной и той же SELECT, но вы можете обернуть его в другой выбрать, чтобы сделать его работу:

SELECT R.* 
FROM (SELECT ABC.A, ABC.B, ABC.C, ROW_NUMBER() OVER (ORDER BY C DESC) AS RowNumber 
     FROM (SELECT A, B, (SELECT smth from another table) as C FROM SomeTable) ABC 
) R 
WHERE R.RowNumber BETWEEN 10 AND 20 
+0

Я не совсем уверен, что правильно сбалансировал скобки, но надеюсь, что это даст вам достаточно информации, чтобы заставить ее работать. – dasblinkenlight

+0

На самом деле это 3 вложенных выбора, которые я пытался избежать, но спасибо в любом случае))) – superM