Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.03.2008, 09:12   #1
sqlnovichok
Новичок
Джуниор
 
Регистрация: 07.03.2008
Сообщений: 1
По умолчанию Поиск свободных значений в столбце IDENTITY

Здравствуйте. Имеется код (взял из MSDN). По описанию данный код находит пустые диапазоны в столбце из последовательности формируемой с помощью IDENTITY. Эти пустые диапазоны (значения) образуются когда строки удаляются из таблицы, но потом при вставке новой строки они не используются, а генерируются новые.
Код:
SET IDENTITY_INSERT Table1 ON
DECLARE @minidentval smallint
DECLARE @nextdentval smallint

SELECT @minidentval = MIN($IDENTITY) FROM Table1
IF @minidentval = IDENT_SEED('Table1')
SELECT @nextdentval = MIN($IDENTITY) + IDENT_INCR('Table1')
FROM Table1 t1
WHERE $IDENTITY BETWEEN IDENT_SEED('Table1') AND 32766 AND
NOT EXISTS (SELECT * FROM Table1 t2 WHERE t2.$IDENTITY =
t1.$IDENTITY + IDENT_INCR('Table1'))
ELSE
SELECT @nextdentval = IDENT_SEED('Table1')

SET IDENTITY_INSERT Table1 OFF

Очень интересует работа этого куска кода:
SELECT @nextdentval = MIN($IDENTITY) + IDENT_INCR('Table1')
FROM Table1 t1
WHERE $IDENTITY BETWEEN IDENT_SEED('Table1') AND 32766 AND
NOT EXISTS (SELECT * FROM Table1 t2 WHERE t2.$IDENTITY =
t1.$IDENTITY + IDENT_INCR('Table1'))
Если можно опишите ПОШАГОВО как происходит поиск значения nextdentval (имеется ввиду логика работы). Заранее благодарен.
Уточняю вопрос
возможно выражение WHERE t2.$IDENTITY = t1.$IDENTITY + IDENT_INCR('Table1') работает так:
можно написать WHERE t1.$IDENTITY + IDENT_INCR('Table1') = t2.$IDENTITY, тогда получается
выбрать те значения t1.$IDENTITY которые будучи увеличенными на IDENT_INCR('Table1') = 1
существуют и в t2.$IDENTITY. Тогда например результат может быть таким
Table_1 t2 t1
1 1 -
2 2 -
3 - 3
- - -
5 - -
- - -
7 7 -
8 - 8
т.к. например берем 1 из t1, увеличиваем ее на 1, получается 2, смотрим есть ли 2 в t2. Т.к.
такое значение имеется то заносим данное значение в результат выборки
SELECT * FROM Table1 t2 WHERE t2.$IDENTITY = t1.$IDENTITY + IDENT_INCR('Table1')
Аналогично со значением 2: 2 + 1 равно 3, а 3 также имеется в t2.$IDENTITY. Значит заносим
в результат выборки именно 2, а не 2 + 1 т.е. 3
Для 3 такие условия не выполняются т.к. 3 + 1 будет 4, а 4 в t2.$IDENTITY нет поэтому 3 не
заносится в результат выборки для t2 и т.д.
После этого применяется фильтр WHERE $IDENTITY BETWEEN IDENT_SEED('Table1') AND 32766 AND
NOT EXISTS и в итоге получается таблица t1
Первоначально я думал что работа выражения WHERE t2.$IDENTITY = t1.$IDENTITY + IDENT_INCR('Table1') для t2 дает следующие результаты
Table_1 t2
1 -
2 2
3 3
- -
5 -
- -
7 -
8 8
т.к. например берем t2.$IDENTITY = 1 ищем среди t1.$IDENTITY такие чтоб t1.$IDENTITY + IDENT_INCR('Table1') получилось 1, но таких среди первоначальных t1.$IDENTITY нет. Т.к. даже 1+1=2
Поэтому t2.$IDENTITY = 1 в выборку не заносим
Берем t2.$IDENTITY = 2 ищем среди t1.$IDENTITY такие чтоб t1.$IDENTITY + 1 получилось 2, этому
удовлетворяет значение t1.$IDENTITY = 1, т.к. 1+1=2. Поэтому t2.$IDENTITY = 2 в выборку заносим
и т.д.
Если кто разбирается помогите пожалуйста и скажите верны ли мои рассуждения.
sqlnovichok вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск значений Rom1k06 Microsoft Office Excel 11 04.09.2008 05:14
Как посчитать сумму в столбце таблицы? Иллидан Microsoft Office Word 1 15.04.2008 21:30
Поиск повторяющихся значений Flangini Microsoft Office Excel 23 22.02.2008 15:57
StringGrid - при пометке строки ставить значок на столбце Mick Standarov Компоненты Delphi 2 03.10.2007 23:26
Подсчёт кол-ва единиц в столбце Freddie_X Microsoft Office Excel 3 10.03.2007 09:38