Нумерация строк в запросе методами платформы
Комментарии
В избранное
Подписаться на ответы
Сортировка:
Древо развёрнутое
Свернуть все
Вообще пронумеровать строки в запросе быстрее программно при его выводе. Данная функция облегчает жизнь при сложной обработке данных во временных таблицах. Теперь можно избавиться от сложных связей с ВТ. Еще стоит упомянуть что сия радость доступна с версии платформы 8.3.13.
(10)
ВЫБРАТЬ
Номенклатура.Артикул КАК Артикул,
АВТОНОМЕРЗАПИСИ() КАК Номер
ПОМЕСТИТЬ ТабАртикулы
ИЗ
Справочник.Номенклатура КАК Номенклатура
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
Склады.Код КАК Код,
АВТОНОМЕРЗАПИСИ() КАК Номер
ПОМЕСТИТЬ ТабСклады
ИЗ
Справочник.Склады КАК Склады
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ТабСклады.Код КАК Код,
ТабСклады.Номер КАК Номер
ИЗ
ТабСклады КАК ТабСклады
УПОРЯДОЧИТЬ ПО
Номер
Код Номер
00001 1
00002 2
00003 3
00004 4
00005 5
00006 6
00009 7
00010 8
00011 9
00012 10
00013 11
00014 12
00015 13
00016 14
00017 15
00018 16
00019 17
00020 18
00021 19
00100 20
00101 21
00102 22
00103 23
00104 24
00105 25
00106 26
00107 27
00108 28
Показать
просто ради прикола выполните несколько раз подряд запрос
результат бывает и такой
Артикул Номер Номер1
31 31
32 32
33 33
34 34
00000005691 35 35
36 36
37 37
00000006383 38 38
39 39
40 40
ВЫБРАТЬ ПЕРВЫЕ 10
Номенклатура.Артикул КАК Артикул,
АВТОНОМЕРЗАПИСИ() КАК Номер
ПОМЕСТИТЬ ТабАртикулы
ИЗ
Справочник.Номенклатура КАК Номенклатура
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ТабАртикулы.Артикул КАК Артикул,
АВТОНОМЕРЗАПИСИ() КАК Номер,
ТабАртикулы.Номер КАК Номер1
ПОМЕСТИТЬ ТабАртикулы2
ИЗ
ТабАртикулы КАК ТабАртикулы
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ТабАртикулы2.Артикул,
ТабАртикулы2.Номер,
ТабАртикулы2.Номер1
ИЗ
ТабАртикулы2 КАК ТабАртикулы2
Показатьрезультат бывает и такой
Артикул Номер Номер1
31 31
32 32
33 33
34 34
00000005691 35 35
36 36
37 37
00000006383 38 38
39 39
40 40
(14)
(14)
Вы, конечно, не поверите, но ничего не меняется, выполняя ваш запрос N раз.
Допускаю, что при определенных условиях может возникать подобная ситуация, но я бы лучше перепроверил где-нибудь еще, чтобы исключить глюк системы.
Проверял на 8.3.13.1865
ВЫБРАТЬ ПЕРВЫЕ 10
Номенклатура.Артикул КАК Артикул,
АВТОНОМЕРЗАПИСИ() КАК Номер
ПОМЕСТИТЬ ТабАртикулы
ИЗ
Справочник.Номенклатура КАК Номенклатура
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ТабАртикулы.Артикул КАК Артикул,
АВТОНОМЕРЗАПИСИ() КАК Номер,
ТабАртикулы.Номер КАК Номер1
ПОМЕСТИТЬ ТабАртикулы2
ИЗ
ТабАртикулы КАК ТабАртикулы
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ТабАртикулы2.Артикул,
ТабАртикулы2.Номер,
ТабАртикулы2.Номер1
ИЗ
ТабАртикулы2 КАК ТабАртикулы2
ПоказатьНоменклатура.Артикул КАК Артикул,
АВТОНОМЕРЗАПИСИ() КАК Номер
ПОМЕСТИТЬ ТабАртикулы
ИЗ
Справочник.Номенклатура КАК Номенклатура
;
////////////////////////////////////////////////////////////
ВЫБРАТЬ
ТабАртикулы.Артикул КАК Артикул,
АВТОНОМЕРЗАПИСИ() КАК Номер,
ТабАртикулы.Номер КАК Номер1
ПОМЕСТИТЬ ТабАртикулы2
ИЗ
ТабАртикулы КАК ТабАртикулы
;
////////////////////////////////////////////////////////////
ВЫБРАТЬ
ТабАртикулы2.Артикул,
ТабАртикулы2.Номер,
ТабАртикулы2.Номер1
ИЗ
ТабАртикулы2 КАК ТабАртикулы2
(14)
Вы, конечно, не поверите, но ничего не меняется, выполняя ваш запрос N раз.
Допускаю, что при определенных условиях может возникать подобная ситуация, но я бы лучше перепроверил где-нибудь еще, чтобы исключить глюк системы.
Проверял на 8.3.13.1865
(19)На ИТС довольно забавное описание:
АВТОНОМЕРЗАПИСИ
Описание:
Функция предназначена для формирования поля с уникальным, последовательно возрастающим значением во временной таблице. Функцию можно использовать в том случае, если необходимо создать ключевое поле во временной таблице. Значение, сформированное этой функцией, будет уникально в пределах временной таблицы, при формировании которой использовалась функция. Начальное значение счетчика зависит от используемой СУБД и, в общем случае, может быть любым. Не гарантируется, что начальное значение счетчика будет равно 1 для любой временной таблицы.
Не поддерживается использование функции АВТОНОМЕРЗАПИСИ() в следующих случаях:
● в запросах, содержащих ОБЪЕДИНИТЬ на верхнем уровне,
● в запросах, которые не формируют временную таблицу,
● вне списка выборки,
● в выражениях языка запросов.
ПоказатьОписание:
Функция предназначена для формирования поля с уникальным, последовательно возрастающим значением во временной таблице. Функцию можно использовать в том случае, если необходимо создать ключевое поле во временной таблице. Значение, сформированное этой функцией, будет уникально в пределах временной таблицы, при формировании которой использовалась функция. Начальное значение счетчика зависит от используемой СУБД и, в общем случае, может быть любым. Не гарантируется, что начальное значение счетчика будет равно 1 для любой временной таблицы.
Не поддерживается использование функции АВТОНОМЕРЗАПИСИ() в следующих случаях:
● в запросах, содержащих ОБЪЕДИНИТЬ на верхнем уровне,
● в запросах, которые не формируют временную таблицу,
● вне списка выборки,
● в выражениях языка запросов.
(6) Ни разу не априори. Надо от задачи и объемов данных смотреть. В некоторых ситуациях программная обработка избавляет от перевалки кучи данных по временным таблицам и от выполнения длиннющих и сложных запросов. Надо здравым смыслом пользоваться.
Мы с Вами говорим практически об одном и том же, акцентируя внимание на разные моменты. Вы абсолютно правы, что при нынешнем состоянии языка запросов программная обработка данных иногда предпочтительнее. Я лишь обращаю внимание на причину этой ситуации.
(27)Вы ещё функцию вычисления хеш-ключа по набору полей пожелайте.
Ну и, до кучи - функцию генерации UUID.
Тут скорее полезность в том, что можно заранее вычислить временную таблицу с каким-то набором ключевых полей - и вот так в запросе её пронумеровать. А затем прилепить её к другим таблицам (по ключевым полям) и/или сделать из неё/них разные выборки (этот подход любят в типовом коде 1С) - а потом их соединять друг с другом - но уже не по ключевым полям - по вот такому полю-нумератору (мэппинг сложно-составного ключа к Числу - но надо делать заранее - и везде использовать готовый набор).
Конечно, прям вряд ли тут будет какой-то большой выигрыш в эффективности (производительности, нагрузки на память, легкочитаемости, хотя вот по модифицируемости - выигрыш может быть заметным), но для ряда очень сложных выборок, активно практикующих такие множественные соединения по одинаковым массивным ключам - может быть полезно!
Другое дело - что такая фишка открывает новые возможности, например с такой нумерацией гораздо проще написать алгоритмы устранения дублей, или сделать выборку, скажем, только чётных строк, или выбрать не только первые N, а наоборот, скажем, пропустить первые N записей, или выбрать, например из середины с M по N (правда с учётом, что нумерация может быть не с 0(1) а с произвольного числа такой код немного усложняется - но всё-таки не становится излишне запутанным!
Так же заметно упрощаются алгоритмы покадрового вычисления и вывода результатов запросов!
Ну и, до кучи - функцию генерации UUID.
Тут скорее полезность в том, что можно заранее вычислить временную таблицу с каким-то набором ключевых полей - и вот так в запросе её пронумеровать. А затем прилепить её к другим таблицам (по ключевым полям) и/или сделать из неё/них разные выборки (этот подход любят в типовом коде 1С) - а потом их соединять друг с другом - но уже не по ключевым полям - по вот такому полю-нумератору (мэппинг сложно-составного ключа к Числу - но надо делать заранее - и везде использовать готовый набор).
Конечно, прям вряд ли тут будет какой-то большой выигрыш в эффективности (производительности, нагрузки на память, легкочитаемости, хотя вот по модифицируемости - выигрыш может быть заметным), но для ряда очень сложных выборок, активно практикующих такие множественные соединения по одинаковым массивным ключам - может быть полезно!
Другое дело - что такая фишка открывает новые возможности, например с такой нумерацией гораздо проще написать алгоритмы устранения дублей, или сделать выборку, скажем, только чётных строк, или выбрать не только первые N, а наоборот, скажем, пропустить первые N записей, или выбрать, например из середины с M по N (правда с учётом, что нумерация может быть не с 0(1) а с произвольного числа такой код немного усложняется - но всё-таки не становится излишне запутанным!
Так же заметно упрощаются алгоритмы покадрового вычисления и вывода результатов запросов!
(29)
хеш мне пока был без надоности.. а вот почему к ID записей объектных таблиц нельзя обращаться в запросах?
насчет сортировки.. когда я комментил у меня была задача, когда надо было интеллектуально сопоставить множество заказов с множеством бонусов для этих заказов. Условно говоря у меня было 2 временных таблицы (сложным образом полученных). Сопоставляю все возможные сочетания записей между ними: нужно получить одну таблицу, в которой результат лучшего мэтчинга (например по минимуму скоринговой функции, вычисляемой по значениям некоторых полей обеих таблиц). Автонумерация (в каждой из сопоставляемых таблиц) здорово помогает, когда скоринговая функция (как бы ее не мудрить) принимает одинаковые значения для разных мэтчингов - тогда можно сделать такое расщепление- при прочих равных кто-то будет предпочтен, благодаря включению в эту функцию автономера... Но вот если бы этот номер был в свою очередь проставлен не произвольно, а в нужном порядке это бы улучшило результат )
Полагаю диалект MSSQL (хотя более глубокое знание SQL у меня еще впереди ))
В любом случае запросом такие штуки сложновато решать, т.к. не учитываются сложности взаимодействия между записями: каждая запись одной таблы мэтчится с записями другой независимо - а ведь выбор одной из возможностей изменяет множество доступной для сопоставления оставшимся.. Т.е. по хорошему такой выбор не сделать (предполагаю) реляционной алгеброй... (ну пришлось там пост обработкой запроса дотачивать).
Вы ещё функцию вычисления хеш-ключа по набору полей пожелайте.
Ну и, до кучи - функцию генерации UUID.
Ну и, до кучи - функцию генерации UUID.
хеш мне пока был без надоности.. а вот почему к ID записей объектных таблиц нельзя обращаться в запросах?
насчет сортировки.. когда я комментил у меня была задача, когда надо было интеллектуально сопоставить множество заказов с множеством бонусов для этих заказов. Условно говоря у меня было 2 временных таблицы (сложным образом полученных). Сопоставляю все возможные сочетания записей между ними: нужно получить одну таблицу, в которой результат лучшего мэтчинга (например по минимуму скоринговой функции, вычисляемой по значениям некоторых полей обеих таблиц). Автонумерация (в каждой из сопоставляемых таблиц) здорово помогает, когда скоринговая функция (как бы ее не мудрить) принимает одинаковые значения для разных мэтчингов - тогда можно сделать такое расщепление- при прочих равных кто-то будет предпочтен, благодаря включению в эту функцию автономера... Но вот если бы этот номер был в свою очередь проставлен не произвольно, а в нужном порядке это бы улучшило результат )
Полагаю диалект MSSQL (хотя более глубокое знание SQL у меня еще впереди ))
В любом случае запросом такие штуки сложновато решать, т.к. не учитываются сложности взаимодействия между записями: каждая запись одной таблы мэтчится с записями другой независимо - а ведь выбор одной из возможностей изменяет множество доступной для сопоставления оставшимся.. Т.е. по хорошему такой выбор не сделать (предполагаю) реляционной алгеброй... (ну пришлось там пост обработкой запроса дотачивать).
(31)Вашу задачу из вашего описания понять очень сложно. Как я написал выше, атонумерацию как ключ сопоставления можно эффективно использовать - если эти ключи-номера рассчитаны единожды во временной таблице - и эта временна таблица далее либо соединяется (по полным ключам) к другим таблицам, либо из уже делаются все остальные выборкии подвыборким, которые далее уже соединяются между собой. Вот именно все дальнейшие соединения уже можно сделать но нумерованному ключу, но генерировать его нужно только в одной верхней выборке!
(32) но если бы была возможность нумеровать не в произвольном порядке (ведь сейчас непредсказуемо какая запись получить меньший автономер а какая больший) то кроме уникальности записей появляется возможность их ранжировать (во временных таблицах), если такое ранжирование нужно. Кажется если сделать индексацию (по полям) то записи (в ВТ) будут пронумерованы в порядке этих индексов )
(33)Вот, честно, не могу понять, что за управляемую нумерацию Вы хотите. Автонумерация - это просто нумерация. Если Вы хотите управлять номером - конструкции "ВЫБОР", "ГДЕ", "ПЕРВЫЕ" и "УПОРЯДОЧИТЬ", а грегатные к Вашим услугам. Просто ранжирование - это применение некой функции-условия - вот её Вы должны написать сами. И не понимаю, как бы вы применяли "Автонумерацию", если бы она всегда начиналась с 0 (она и так автоупорялоченна согласно сортировки), кроме того что я уже выше написал - с единомоментной нумерацией, и а весь функционал дальше уже оформляется поствыборками!
(36)во временной таблице нет никакой сортировки. (в смысле оператор "упорядочить" отсутствует во временных таблицах.
Неявным образом применение индексирования упорядочивает записи (но это не гарантируется) и оператор Автономер - сработает _до_ индексирования. Т.е. нужно сначала ВТ индексировать, а потом в следующем запросе пакета из этой индексированной таблицы уже запросить и сделать автономер. (но опят же это все не гарантирует результат)
Неявным образом применение индексирования упорядочивает записи (но это не гарантируется) и оператор Автономер - сработает _до_ индексирования. Т.е. нужно сначала ВТ индексировать, а потом в следующем запросе пакета из этой индексированной таблицы уже запросить и сделать автономер. (но опят же это все не гарантирует результат)
(37), Да "УПОРЯДОЧИТЬ ПО" нельзя применить во временной таблице без ключевого слова "ПЕРВЫЕ", но кто Вам мешает сделать вот так
Этот код у меня в базе (на MS SQL, PG, Oracle нет сейчас под рукой) отбирает только 10 записей - согласно условию отбора - и присваивает им номера от 1 до 10 согласно заданной сортировке по Коду
ВЫБРАТЬ ПЕРВЫЕ 10000000000000000
Номенклатура.Ссылка,
Номенклатура.Код КАК Код,
АВТОНОМЕРЗАПИСИ() КАК Автономер
ПОМЕСТИТЬ тз
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Код > "00000000005"
И Номенклатура.Код < "000000066"
УПОРЯДОЧИТЬ ПО
Код
ПоказатьЭтот код у меня в базе (на MS SQL, PG, Oracle нет сейчас под рукой) отбирает только 10 записей - согласно условию отбора - и присваивает им номера от 1 до 10 согласно заданной сортировке по Коду
Если у вас номер строки начинается не с единицы:
ВЫБРАТЬ
АВТОНОМЕРЗАПИСИ() КАК НомерСтроки,
СправочникНоменклатура.Ссылка КАК Номенклатура
ПОМЕСТИТЬ ВТ_Данные
ИЗ
Справочник.Номенклатура КАК СправочникНоменклатура
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
МИНИМУМ(Данные.НомерСтроки) КАК МинимальныйНомерСтроки
ПОМЕСТИТЬ ВТ_МинимальныйНомерСтроки
ИЗ
ВТ_Данные КАК Данные
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
Данные.НомерСтроки - ВТ_МинимальныйНомерСтроки.МинимальныйНомерСтроки + 1 КАК НомерСтроки,
Данные.Номенклатура КАК Номенклатура
ИЗ
ВТ_Данные КАК Данные,
ВТ_МинимальныйНомерСтроки КАК ВТ_МинимальныйНомерСтроки
ПоказатьВопросы с вознаграждением
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|