2015-05-06 1 views
1

Я пытаюсь реализовать разбиение на страницы в запросе, который построен с использованием информации из представления, и мне нужно использовать функцию row_number() над столбцом, когда я не знаю, какая таблица это из.Неоднозначное имя столбца с использованием row_number() без псевдонима

SELECT * FROM (
     SELECT class.ID as ID, user.ID as USERID, row_number() over (ORDER BY 
     ID desc) as row_number FROM class, user 
) out_q WHERE row_number > @startrow ORDER BY row_number 

Проблема заключается в том, что у меня есть только имя столбца результата (ID или USERID), которые пришли из предыдущего запроса. Если я выполню этот запрос, он поднимет ошибку «Неоднозначное имя столбца» ID. Есть ли способ указать, что я ссылаюсь на идентификатор столбца, который выбирается, а не из другой таблицы?

Можно ли указать псевдоним на результат запроса?

Я уже пробовал следующие,

SELECT TOP 30 * FROM (
     SELECT *, row_number() over (ORDER BY ID desc) as row_number FROM(
      SELECT class.ID as ID, user.ID as USERID FROM class, user 
    ) in_q 
) out_q WHERE row_number > @startrow ORDER BY row_number 

Он работает, но SGBD путается, на каком плане запроса он должен использовать, из-за небольшой строки цели настоящего во внешнем запросе и большой набор результатов, возвращаемых внутренним запросом, когда @startrow - небольшое число, запрос выполняется менее чем за одну секунду, когда это большой номер, для выполнения запроса требуются минуты.

+0

В внутреннем запросе нет нескольких имен. – dinhokz

ответ

1

Ваша проблема id в самой row_number. Если вы хотите стабильный сортировать, тогда включите оба идентификатора:

SELECT * 
FROM (SELECT class.ID as ID, user.ID as USERID, 
      row_number() over (ORDER BY class.ID desc, user.id) as row_number 
     FROM class CROSS JOIN user 
    ) out_q 
WHERE row_number > @startrow 
ORDER BY row_number; 

Я предполагаю, что декартовый продукт является намеренным. Иногда это указывает на ошибку в запросе. В общем, я бы посоветовал вам избегать использования запятых в предложении from. Если вы хотите декартовой продукт, то явным образом используйте CROSS JOIN.

+0

Я использовал декартово произведение, просто упростив проблему. – dinhokz

+0

У меня нет доступа к псевдониму таблицы, вот в чем проблема. В приложении я знаю только имя столбца. Я пытаюсь динамически изменить любой запрос, чтобы изменить порядок строк. – dinhokz

1

Вы можете попробовать использовать эту функцию, которую вы уже пробовали, а затем использовать подсказку OPTIMIZE FOR.

OPTION (OPTIMIZE FOR (@startrow = 100000));

Смотрите описание намеком в MSDN документы здесь: https://msdn.microsoft.com/en-us/library/ms181714.aspx.

+0

Хороший отзыв, но это не сработало .. – dinhokz

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