|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
07.03.2008, 09:12 | #1 |
Новичок
Джуниор
Регистрация: 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 в выборку заносим и т.д. Если кто разбирается помогите пожалуйста и скажите верны ли мои рассуждения. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Поиск значений | 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 |