Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.04.07;
Скачать: [xml.tar.bz2];

Вниз

Задачка sql   Найти похожие ветки 

 
TSa   (2003-03-18 00:04) [0]

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


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

>число 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


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

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


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

Johnmen какой ?


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

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


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

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

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



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

Приведенное решение придумано не мной(а кем, забыл, но кем-то из известных, типа автора 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 промежутка, во второй - конечный.
В третьей количество удаленных записей в промежутке.



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2003.04.07;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.45 MB
Время: 0.007 c
8-19703
drin
2002-12-23 03:45
2003.04.07
Форматы


1-19652
Фагот
2003-03-25 17:54
2003.04.07
StringList


14-19826
Анонимщик
2003-03-19 18:41
2003.04.07
Сервисы, реестр, безопасность


3-19485
melavcorp
2003-03-19 17:45
2003.04.07
Компонент типа TDBJpegImage или что-то подобное..


3-19479
dmi-vancev
2003-03-16 01:19
2003.04.07
IBase





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский