ROW_NUMBER () столбец недопустим и пытается ускорить запрос справки - PullRequest
0 голосов
/ 04 марта 2009

Я пытаюсь использовать функцию ROW_NUMBER, но у меня две проблемы. 1) Поскольку я упорядочиваю счет в порядке убывания, rowid начинается не с 1, а с 41, например. 2) Когда я пытаюсь вернуть rowid между 42 и 52, он говорит, что rowid является недопустимым столбцом. Вот уменьшенный запрос с некоторыми дополнительными столбцами, поэтому он более читабелен:

SELECT ROW_NUMBER() OVER (ORDER BY column1) AS rowid,
hrl.column0
(SELECT top 1 bus from hc WHERE column2 = hc.column2) AS c,
'Site' as Based,
column1, column2, column3, column4,
CASE WHEN status = '1' Then 'Active'
     WHEN status = '2' Then 'Canceled'
ELSE
   'Unknown'
END as column5,
column6,
(select count(*) from hrl where column1 = hrl.column1) as [cnt]
FROM hrl
INNER JOIN hc on hc.column2 = hrl.column2
INNER JOIN rsc on rsc.column3 = hrl.column3
LEFT OUTER JOIN  gmt on gmt.[column7] = hrl.[column7]
where bus LIKE '%test%'
ORDER BY [cnt] desc,rowid
and  rowid >= 1 AND rowid <= 10 -- Says rowid is invalid

Вот данные, которые я хочу

RowID Business Count

1     Green    50
2     Red      30
3     Blue     20

Вот что я получаю:

RowID Business Count

3     Blue     20
2     Red      30
1     Green    50

Ответы [ 2 ]

3 голосов
/ 04 марта 2009

Поместите его в подзапрос:

SELECT *
FROM (
    SELECT ROW_NUMBER() OVER (ORDER BY column1) AS rowid,
    hrl.column0,
    (SELECT top 1 bus from hc WHERE column2 = hc.column2) AS c,
    'Site' as Based,
    column1, column2, column3, column4,
    CASE WHEN status = '1' Then 'Active'
         WHEN status = '2' Then 'Canceled'
    ELSE
       'Unknown'
    END as column5,
    column6,
    (select count(*) from hrl where column1 = hrl.column1) as [cnt]
    FROM hrl
    INNER JOIN hc on hc.column2 = hrl.column2
    INNER JOIN rsc on rsc.column3 = hrl.column3
    LEFT OUTER JOIN  gmt on gmt.[column7] = hrl.[column7]
    where bus LIKE '%test%'
) sq
WHERE rowid >= 1 AND rowid <= 10
ORDER BY [cnt] DESC

Если вы хотите, чтобы TOP 10 column1 строк упорядочивалось тогда по [cnt], вы можете использовать:

SELECT *
FROM (
    SELECT TOP 10
           hrl.column0,
           (SELECT top 1 bus from hc WHERE column2 = hc.column2) AS c,
           'Site' as Based,
           column1, column2, column3, column4,
           CASE WHEN status = '1' Then 'Active'
                WHEN status = '2' Then 'Canceled'
                ELSE 'Unknown'
           END as column5,
           column6,
           (select count(*) from hrl where column1 = hrl.column1) as [cnt]
    FROM   hrl
    INNER JOIN hc on hc.column2 = hrl.column2
    INNER JOIN rsc on rsc.column3 = hrl.column3
    LEFT OUTER JOIN  gmt on gmt.[column7] = hrl.[column7]
    WHERE  bus LIKE '%test%'
    ORDER BY column1
) sq
ORDER BY [cnt] DESC

Или, если вам просто нужно ORDER BY [cnt] DESC, попробуйте это:

SELECT TOP 10
       hrl.column0,
       (SELECT top 1 bus from hc WHERE column2 = hc.column2) AS c,
       'Site' as Based,
       column1, column2, column3, column4,
       CASE WHEN status = '1' Then 'Active'
            WHEN status = '2' Then 'Canceled'
            ELSE 'Unknown'
       END as column5,
       column6,
       (select count(*) from hrl where column1 = hrl.column1) as [cnt]
FROM   hrl
INNER JOIN hc on hc.column2 = hrl.column2
INNER JOIN rsc on rsc.column3 = hrl.column3
LEFT OUTER JOIN  gmt on gmt.[column7] = hrl.[column7]
WHERE  bus LIKE '%test%'
ORDER BY [cnt] DESC
0 голосов
/ 25 марта 2009

Обернуть несортированные данные как CTE (общее табличное выражение)

;with NotSorted as (
    SELECT  ROW_NUMBER() OVER (ORDER BY column1) AS rowid, 
        hrl.column0, 
        (SELECT top 1 bus from hc WHERE column2 = hc.column2) AS c,
        'Site' as Based, column1, column2, column3, column4,
        CASE WHEN status = '1' Then 'Active'
             WHEN status = '2' Then 'Canceled'
             ELSE 'Unknown'
        END as column5, column6,
        (select count(*) from hrl where column1 = hrl.column1) as [cnt]
    FROM    hrl
            INNER JOIN hc on hc.column2 = hrl.column2
            INNER JOIN rsc on rsc.column3 = hrl.column3
            LEFT OUTER JOIN  gmt on gmt.[column7] = hrl.[column7]
    where   bus LIKE '%test%'
)
select  *
from    NotSorted
ORDER BY [cnt] desc, rowid and  rowid >= 1 AND rowid <= 10

Что касается,

и rowid> = 1 AND rowid <= 10 - говорит, что rowid недействителен </p>

Вы не можете получить доступ к вычисляемому псевдониму напрямую, и вы обычно помещаете вычисляемый столбец в подзапрос или как CTE

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...