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

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

Задачка sql [MySQL]


TSa ©   (2003-03-18 00:04:00) 

Подскажите как можно сделать следующие на MySQL или хотябы IB:
Вот есть БД с именем bd1 в ней одно числовое поле в этом поле записаны числа по порядку например от 5 до 100 или от 1 до 10 неважно нужно изнать, мы удалем из этой таблицы одну запись нужно узнать какое число пропало т.е. удалили мы в промежутке от 1..10 число 4 нужно узать что его нет !!!
Я думаю сделать так одним запросом создать новую таблицу (временно) и по порядку прономировать все записи во вотором поле и потом проверить что не совпадпет то что не совпадает и будет наше значение правельно лия мыслю или это можно по рациональнее сделать ?


Johnmen   (2003-03-19 10:06:00) [1]

Приведенное решение придумано не мной(а кем, забыл, но кем-то из известных, типа автора FIB"ов) :
SELECT T.ID+1, MIN(T1.ID)-1, MIN(T1.ID)-T.ID-1
FROM TABLE1 T
JOIN TABLE1 T1 ON T.ID<T1.ID
WHERE T.ID<=1000 AND T1.ID<=1000
GROUP BY T.ID
HAVING MIN(T1.ID)-T.ID>1

Получаем промежутки в которых удалены записи.
В первой колонке будет начальный ID промежутка, во второй - конечный.
В третьей количество удаленных записей в промежутке.


MsGuns   (2003-03-18 23:36:00) [2]

>TSa © (18.03.03 22:23)
>Johnmen какой ?

Очень хитрый. Ставишь на таблицу экскюзив, закачиваешь в НД все
ее записи и в цикле While Not Eof сравниваешь значение поля на предмет "преимущества" его перед предыдущим ровно на 1.
Если нет, то "дырка". Если нужна только первая, то выход с передачей полученного значения. Сделай это как ХП (в эклюзив можешь не переводить, просто выставь транзакции, из которой будешь запускать ХП, соотв. изоляцию) и работать будет на несколько порядков быстрее, чем по методу запроса с JOIN.


TSa   (2003-03-18 23:15:00) [3]

ЮЮ в том то и прикол что надо найти первую которая не по порядку, а какая она будет не известно


TSa   (2003-03-18 22:23:00) [4]

Johnmen какой ?


Johnmen   (2003-03-18 09:39:00) [5]

Есть еще универсальный запрос для выборки всех "дырок".


ЮЮ   (2003-03-18 04:50:00) [6]

>число 4 нужно узать что его нет
Select * from table where ID = 4 - и узнаешь есть 4 или нет :-)

SELECT L.ID
FROM Table L LEFT JOIN Table R ON L.ID + 1 = R.ID
WHERE R.ID IS NULL
вернёт все записи, для которых не нашлось следующей записи с ID равным ID + 1


Наверх

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