Преимущества использования порядкового позиционного обозначения SQL? - PullRequest
29 голосов
/ 12 февраля 2010

Справочная информация

Порядковое обозначение позиции, порядковые номера AKA, является сокращением столбца на основе порядка столбцов в списке столбцов в предложении SELECT вместо имени столбца или псевдонима столбца. Обычно поддерживаемый в предложении ORDER BY, некоторые базы данных (MySQL 3.23+, PostgreSQL 8.0+) также поддерживают синтаксис для предложения GROUP BY.

Вот пример использования Ordinals:

GROUP BY 1, 2
ORDER BY 1, 2

Это нехорошо использовать, потому что это делает запрос хрупким - если меняется порядок столбцов, необходимо обновить порядковые номера, иначе ваш запрос не вернет то, что вы думали. Весьма вероятно, что вы получите ошибку при использовании в GROUP BY, если столбцы в этих местах будут объединены в агрегаты ...

Вопрос

Единственное преимущество, которое я могу придумать, - это меньшее количество данных, отправляемых по проводам, если вы не используете хранимые процедуры или функции (которые, в любом случае, ставят под сомнение порядковое использование). Есть ли какие-то другие преимущества, которые я упускаю?

Раскрытие

Это может звучать как домашнее задание, но это действительно исследование для образовательного ланча, который офис проводит каждый месяц. Они платят за обед, мы должны предоставить небольшую интересную тему.

Ответы [ 6 ]

29 голосов
/ 24 февраля 2010

Я бы использовал это:

  • Если вы любите устранять неисправности
  • Создание специальных запросов без intellisense

Верха нет.

SQL Server поддерживает только в ORDER BY. В любом другом месте это выражение для оценки.

15 голосов
/ 09 июля 2010

Часто, когда я запрашиваю таблицу с большим количеством столбцов (в ad-hoc-land только для исследования данных ... Я бы никогда не написал такой код для среды PROD), я делаю что-то подобное, чтобы получить поля Я забочусь о близких:

select top 1000
  Col_1, Col_18, Col_50, Col_117, *
from
  TableWithTonsOfCols
order by
  1, 4 desc, 3

Если бы я сказал order by Col_1, Col_117 desc, Col_50, мой запрос был бы отклонен, потому что оператор не знал, какие столбцы я хотел заказать, из-за удвоения "*". Не очень часто, но все же полезная функция.

4 голосов
/ 12 февраля 2010

Два варианта использования для меня:

  • Я спешу и не хочу печатать, поэтому я использую порядковый номер. Я всегда преобразовывал бы это в имя столбца для любого временного использования
  • столбец, по которому я упорядочиваю, является длинным оператором CASE; вместо того, чтобы перепечатывать оператор CASE для предложения ORDER BY, я использую порядковый номер, который сохраняет его DRY . Есть способы обойти это, например, используя CTE, подзапросы или представление, но я часто нахожу, что порядковый номер - самое простое решение.
2 голосов
/ 13 февраля 2010

Сейчас я склонен использовать встроенные представления:

select col_a, count(*) from
  (select case ...... end col_a from ...)
group by col_a
order by col_a;

Но в те дни, когда они имели правильный синтаксис, это помогло перепечатать полный текст столбца.С хитрыми функциями у вас была возможность расхождения между значением в SELECT и ORDER BY, например

select ltrim(col_name,'0123456789')
from table
order by ltrim(col_name,'123456789')

. «0» в SELECT означает, что вы не упорядочиваете по тому, что выбираете.

1 голос
/ 29 июня 2016

У меня есть алгоритм генерации запроса - SQL генерируется автоматически. Использование порядкового номера означает, что я могу ссылаться на сгенерированное поле без необходимости извлекать имя поля снова. Пользователь может обратиться к имени поля в таблице, выбрав его из списка на экране. Пока я приведу список в соответствие с sql, мне никогда не потребуется знать имена полей, если бы элементы SELECT тоже были порядковыми.

Память говорит, что это было в стандарте SQL в конце 1970-х

0 голосов
/ 12 февраля 2010

Если я правильно помню, использование таких ординалов, как вы описали, не рекомендуется Microsoft в будущем выпуске SQL Server. Я могу ошибаться в этом, но я думаю, что это так. Мне всегда нравилось использовать их в некоторых случаях, потому что это связано с меньшим набором текста, когда вы имеете дело с производными столбцами, которые содержат длинный запрос.

...