Псевдоним игнорируется в OrderBy

В нашем приложении есть две таблицы, обе из которых имеют столбец ShowOrder. Мы используем NHibernate в нашем приложении, а с помощью HQL мы соединяем эти две таблицы, упорядоченные по ShowOrder первой таблицы и второй таблицы соответственно.

Вот упрощенная версия моего запроса:

SELECT pr.Id as Id,pr.Title as Title, pr.ShowOrder as ShowOrder 
FROM Process pr 
    INNER JOIN ProcessGroup prg ON pr.GroupId=prg.Id 
ORDER BY prg.ShowOrder,pr.ShowOrder

В целом наше приложение работает без проблем. Но у нас есть старое приложение и процедура преобразования для преобразования его базы данных в нашу новую базу данных приложения.

Всякий раз, когда мы конвертируем старую базу данных в нашу новую базу данных, возникает ошибка, когда сервер SQL хочет выполнить вышеуказанный запрос. Исключение говорит:

Столбец указан более одного раза в порядке списка

Если мы выберем pr.ShowOrder без псевдонима, то все в порядке.

Кажется, что если в списке выбора есть псевдоним ShowOrder, SQL Server игнорирует псевдонимы таблиц и предполагает, что pr.ShowOrder и prg.ShowOrder одинаковы.


person Beatles1692    schedule 02.09.2009    source источник


Ответы (3)


Это изменение поведения между SQL Server 2000 и SQL Server 2005.

http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/198b29db-f223-4aaf-a9f2-965c8a1fa8eb

person MartW    schedule 02.09.2009
comment
Спасибо за ответ. Поменял уровень совместимости и все ок. - person Beatles1692; 02.09.2009

Это стандартное поведение ANSI SQL, которое было принято SQL Server, начиная с версии 2005.

ORDER BY НЕ работает со значениями столбцов из исходных таблиц (предложение FROM), а технически работает ТОЛЬКО со значениями столбца output в предложении SELECT (**). Поэтому, когда вы говорите «ShowOrder» в предложении ORDER BY, на самом деле используется значение ShowOrder в выходном списке (которое оказывается pr.ShowOrder). Если вы хотите использовать оба ShowOrders, вы должны поместить их оба в предложение SELECT с разными именами.

Причина, по которой это не лает, когда вы используете псевдонимы исходных таблиц (что технически должно быть), заключается в совместимости с SQL Server 2000, но это опасная совместимость. Независимо от того, какой псевдоним вы используете в ORDER BY, на самом деле используется только тот, который появляется в выходном списке.

(** - и да, есть способы обойти это, но они в основном предназначены для обеспечения некоторой совместимости с предыдущими версиями. Вам лучше просто использовать стандарт).

person RBarryYoung    schedule 02.09.2009

Другая причина этой ошибки может заключаться в том, что уровень совместимости базы данных установлен на «режим 2000» (это может произойти после обновления SQL Server с версии 2000 до версии 2005 или выше).

Решение:

«Студия управления SQL» — щелкните правой кнопкой мыши базу данных — «свойства» — «параметры» — «уровень совместимости» — установите значение 90 или выше.

person Alex from Jitbit    schedule 04.02.2011
comment
Я действительно сделал то же самое - person Beatles1692; 06.02.2011