Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Поиск "дырки" в записях [D7, SQLite]


Страницы:   1 2

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 надеюсь не используется как первичный ключ?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо