![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Поиск "дырки" в записях [D7, SQLite]
Maacheba © (2009-02-12 19:05:00)Есть таблица, назовем ее "MyTable", формат:
Number | FlagDeleting
Number - число, FlagDeleting - тоже число, если равно 1 - то запись считается уничтоженной в запросах (но физически из таблицы не удаляется).
Задача: найти первую свободную "дырку" в последовательности Number среди не помеченных на удаление записях.
Пример:
Number | FlagDeleting
================
1 | 0
6 | 0
4 | 0
2 | 0
Правильный ответ: 3
Еще пример:
Number | FlagDeleting
================
1 | 0
2 | 1
3 | 0
4 | 0
Правильный ответ: 2
Чтобы найти дырку - с успехом срабатывает такой код:
SELECT MyTable.Number + 1 from MyTable left join
MyTable m on (MyTable.Number + 1 = m.Number) where '
(m.Number is null) and (MyTable.Number+1 > X)
Где "X" - фактически задает тот лимит с которого искать дырку. Если X = 0, то дырка начинает искаться с числа 1, если задать X=5, то дырка начинает искаться 6 и т.д.
Вопрос в том, что нужно учесть столбец FlagDeleting, помеченые как удаленные записи просто не рассматривать. Если делать так:
SELECT MyTable.Number + 1 from MyTable left join
MyTable m on (MyTable.Number + 1 = m.Number) where '
(m.Number is null) and (MyTable.Number+1 > X) and (MyTable.FlagDeleting=0)
То такой запрос возвращает NULL.
Если условиеMyTable.FlagDeleting=0заменить наm.FlagDeleting=0или их сочетание - тоже самое.
Не понимаю, почему так происходит и как это исправить?
P.S. База - SQLite
MsGuns (2009-02-13 12:15:00) [21]Пардон, не запрос, а хранимку или функцию (не знаком с лайтом)
MsGuns (2009-02-13 12:14:00) [22]Такой запрос написать не проблема, но он будет выполняться медленно, однако механизм такого "резервирования" какой-то неуклюжий. Если Вы объясните великий смысл этого загадочного Number, нам будет много проще помочь
Maacheba (2009-02-13 12:12:00) [23]
> Number надеюсь не используется как первичный ключ?
нет, конечно.
Maacheba (2009-02-13 12:11:00) [24]Ух, почему-то при просмотре ветки она закешировалась, думал нет новых ответов...
Спасибо всем за помощь!
Maacheba (2009-02-13 11:57:00) [25]Никто не поможет?
Johnmen (2009-02-13 09:45:00) [26]
> Maacheba (12.02.09 19:05)
Просто в условие соединения добавитьand (m.FlagDeleting=0)
Jack128_ (2009-02-13 09:23:00) [27]Блин.
>
> where (MyTable.Number+1 > X) and ((m.Number is null) or
> (m.FlagDeleting=0))
вобщем сам разберешся, смысл, надеюсь понял..
Jack128_ (2009-02-13 08:38:00) [28]
> left join
> MyTable m on (MyTable.Number + 1 = m.Number) and m.FlagDeleting =0
Хотя навскидку моно и оставить в where, примерно в таком виде:
where (MyTable.Number+1 > X) and ((m.Number is null) or (MyTable.FlagDeleting=0))
Jack128_ (2009-02-13 08:35:00) [29]
> m.FlagDeleting=0
это условие помести в
left join
MyTable m on (MyTable.Number + 1 = m.Number) and m.FlagDeleting<>0
Palladin (2009-02-13 08:04:00) [30]Number надеюсь не используется как первичный ключ?