Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Счетчик внутри запроса  [new]
demoniqus
Member

Откуда: Ото всюду
Сообщений: 37
Есть запрос вида INSERT INTO #table1 (field1, field2, ..., fieldN) SELECT (value1, value2, ..., valueN) FROM #table2;
Требуется, чтобы поле field1 содержало следующий порядковый номер записи (1,2,...,N)
Данный запрос выполняется в цикле по выборке. При этом при каждой итерации счетчик в field1 должен сбрасываться в единицу и заново наращиваться. Поэтому я не могу использовать обычное auto_increment поле.
Кривой и ужасный метод - переделать запрос так, чтобы вставку производить поэлементно в цикле. А возможно ли сделать так, чтобы value1 наращивался "внутри" запроса?
26 фев 15, 10:32    [17314051]     Ответить | Цитировать Сообщить модератору
 Re: Счетчик внутри запроса  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21242
Ну так вместо SELECT field1, ... делайте SELECT ROW_NUMBER(), ...
26 фев 15, 10:34    [17314071]     Ответить | Цитировать Сообщить модератору
 Re: Счетчик внутри запроса  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
demoniqus,

1. Зачем в SELECTе скобки?
2. ROW_NUMBER()OVER()
26 фев 15, 10:35    [17314076]     Ответить | Цитировать Сообщить модератору
 Re: Счетчик внутри запроса  [new]
demoniqus
Member

Откуда: Ото всюду
Сообщений: 37
Да, я тоже нашел этот Row_Number. Это самый быстрый и рациональный способ... или просто единственный?

IAP, скобки в SELECT действительно не нужны... дурная привычка моя)))
26 фев 15, 10:44    [17314126]     Ответить | Цитировать Сообщить модератору
 Re: Счетчик внутри запроса  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21242
demoniqus
Это самый быстрый и рациональный способ... или просто единственный?
А тебе не пофиг? Работает? да. Понятно? да. Сопровождаемо? да. Чего тебе ещё нужно?

PS. Нет, это не единственный способ.
26 фев 15, 11:11    [17314301]     Ответить | Цитировать Сообщить модератору
 Re: Счетчик внутри запроса  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
demoniqus
Да, я тоже нашел этот Row_Number. Это самый быстрый и рациональный способ... или просто единственный?

Ех, если б вы еще правила форума почитали то нашли б вот Ето
26 фев 15, 11:39    [17314479]     Ответить | Цитировать Сообщить модератору
 Re: Счетчик внутри запроса  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
demoniqus
Да, я тоже нашел этот Row_Number. Это самый быстрый и рациональный способ... или просто единственный?

IAP, скобки в SELECT действительно не нужны... дурная привычка моя)))


Если уж вам ещё способ нужен, и поскольку у вас INSERT ... SELECT , по прокатит вот такой способ.

https://msdn.microsoft.com/en-us/library/ms189838.aspx

Возможно он будет оптимальнее.
26 фев 15, 12:06    [17314661]     Ответить | Цитировать Сообщить модератору
 Re: Счетчик внутри запроса  [new]
invm
Member

Откуда: Москва
Сообщений: 9824
a_voronin
поскольку у вас INSERT ... SELECT
Функция identity применима только в запросах SELECT ... INTO ...
26 фев 15, 12:19    [17314749]     Ответить | Цитировать Сообщить модератору
 Re: Счетчик внутри запроса  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
invm
a_voronin
поскольку у вас INSERT ... SELECT
Функция identity применима только в запросах SELECT ... INTO ...


Я думаю тут как раз это и надо. ибо темп таблица
26 фев 15, 12:40    [17314900]     Ответить | Цитировать Сообщить модератору
 Re: Счетчик внутри запроса  [new]
demoniqus
Member

Откуда: Ото всюду
Сообщений: 37
IDENTITY вряд ли пройдет, т.к. возвращает идентификатор последней вставленной записи. У меня же все записи набираются в единую таблицу (которая хоть и временная, но сохраняется в единственном оригинальном экземпляре весь сеанс), а значит счетчик не будет сбрасываться на каждой итерации... т.е. на втором круге это уже будет 2Х и т.д.

ROW_NUMBER вроде справился с поставленной задачей судя по полученным результатам.

to MAXX
Я вообще не специалист по SQL-языкам и с трудом представляю, что вообще надо искать (в смысле как это выразить на обычном человеческом языке), не говоря уже о том, как оно правильно называется. До этого имел дело с MySQL, где набор операторов и возможностей существенно отличается... ))))
Просто мне дали задание и сказали "Сделать", хотя я изначально специалист из другой области)))))
26 фев 15, 16:20    [17316625]     Ответить | Цитировать Сообщить модератору
 Re: Счетчик внутри запроса  [new]
Glory
Member

Откуда:
Сообщений: 104751
demoniqus
IDENTITY вряд ли пройдет, т.к. возвращает идентификатор последней вставленной записи. У меня же все записи набираются в единую таблицу (которая хоть и временная, но сохраняется в единственном оригинальном экземпляре весь сеанс), а значит счетчик не будет сбрасываться на каждой итерации... т.е. на втором круге это уже будет 2Х и т.д.

свойства столбца identity и функция identity() - это разные вещи
26 фев 15, 16:24    [17316646]     Ответить | Цитировать Сообщить модератору
 Re: Счетчик внутри запроса  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
demoniqus
а значит счетчик не будет сбрасываться на каждой итерации
А сбрасывать его невозможно, да?
Можно сделать таблице TRUNCATE, а можно выполнить DBCC CHECKIDENT
26 фев 15, 16:25    [17316655]     Ответить | Цитировать Сообщить модератору
 Re: Счетчик внутри запроса  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
iap
demoniqus
а значит счетчик не будет сбрасываться на каждой итерации
А сбрасывать его невозможно, да?
Можно сделать таблице TRUNCATE, а можно выполнить DBCC CHECKIDENT
Правда, действительно, для второго захода с функцией IDENTITY() таблицу сначала придётся удалить.
26 фев 15, 16:26    [17316669]     Ответить | Цитировать Сообщить модератору
 Re: Счетчик внутри запроса  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
Может проще temp таблицу сразу с IDENTITY создать и не париться.

CREATE TABLE #tmp
(
ID INT IDENTITY(1, 1) ,
...);
26 фев 15, 16:50    [17316889]     Ответить | Цитировать Сообщить модератору
 Re: Счетчик внутри запроса  [new]
set identity insert and drop
Guest
a_voronin
Может проще temp таблицу сразу с IDENTITY создать и не париться.

CREATE TABLE #tmp
(
ID INT IDENTITY(1, 1) ,
...);

вот, коллега дело говорит!
26 фев 15, 17:09    [17317043]     Ответить | Цитировать Сообщить модератору
 Re: Счетчик внутри запроса  [new]
demoniqus
Member

Откуда: Ото всюду
Сообщений: 37
IAP, в том-то и дело, что таблицу удалять нельзя... Скажем так: она не совсем временная, создается и используется вне курсора, которые ее заполняет. Не думаю, что хорошей идеей будет на каждой итерации создавать новую таблицу, наполнять ее, а в конце переносить данные в другую таблицу, которая будет использована далее...

AKINA, мне не пофиг, т.к. я не могу прогнозировать объем данных, который будет проходить через эту процедуру... может 100 строк, а может 100000000 строк - я не обладаю информацией для такого прогноза. Могу лишь предполагать, что потенциально скорость и надежность имеют приоритет выше, нежели сопровождаемость и понятность... в конце концов можно и прокомментировать всю логику работы.

Glory, вероятно мы не совсем понимаем друг друга. Меня интересует не нумерация столбцов, а нумерация строк, а потому IDENTITY столбца
Glory
свойства столбца identity и функция identity() - это разные вещи

мне не подойдет

A_VORONIN - в первом посте я уже отмел эту идею. На втором цикле не произойдет "сброса" нумерации. А создание еще одной временной таблицы на каждой итерации, заполнение ее, а в конце итерации перенос данных из нее - на мой взгляд просто жуть... хотя не проверял, может вдруг будет работать быстрее???


И еще: не хочу пока разводить новую ветку, появился еще один вопрос:
Получаю таблицу (картинка в приложении) с колонками:
- rMaket, lMaket - произвольный строковый макет математического выражения вида (p1) [+-/*] (p2) [+-/*] ... [+-/*] (pN)
- pl[N], pr[N] - набор колонок, содержащих числовые значения для вычисления этих математических выражений
Пока единственный способ, который я знаю, чтобы решить эти выражения - идти построчно в цикле, создавать текстовую команду, куда подставлять данные значения и выполнять ее через exec(). Может существует способ сделать все это быстрее? Я пока не наткнулся на такое...

К сообщению приложен файл. Размер - 3Kb
27 фев 15, 14:40    [17321300]     Ответить | Цитировать Сообщить модератору
 Re: Счетчик внутри запроса  [new]
Требуется, чтобы
Guest
demoniqus,

17316655
про "нумерацию столбцов" тут никто и не говорил
решений - полный топик
27 фев 15, 18:17    [17322694]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить