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

Вниз

Можно ли сделать такой запрос?   Найти похожие ветки 

 
SergP   (2004-01-09 16:10) [0]

Вобщем такая проблема:
Есть таблица с автоинкрементным полем (допустим id). Так вот:
нужно "вытащить" все id начиная с минимального в таблице и кончая максимальным, но причем такие, которых нет в таблице.

Т.е. например в таблице есть:
1,2,3,5,8,9,10,12

То я должен получить:
4,6,7,11

Мож кто знает как написать такой запрос ? И вообще можно ли это сделать с помощью SQL - запроса?

База MySQL


 
Academic   (2004-01-09 16:18) [1]

одним запросом нельзя. пиши SP, с перебором всех значений до
max(ID)


 
Term   (2004-01-09 16:19) [2]

Если токо ХП, но их кажется нет в MySQL


 
Stas   (2004-01-09 16:23) [3]

или сделать временную таблицу с полем ID_1 со значениями например 0-100, Потом присоеденить ее

select ID_1 from Table1
Left Join Table2 ON Table1.ID_1=Table2.ID
WHERE ID is NUll

Помоему так.


 
SergP   (2004-01-09 16:25) [4]


> Academic © (09.01.04 16:18) [1]
> одним запросом нельзя. пиши SP, с перебором всех значений
> до
> max(ID)


Это плохо.
А вообще-то это мне нужно не для Дельфи а для PHP (за что и извиняюсь, так как форум по Дельфи).

Но на PHP делать перебор как-то не совсем то что хотелось бы...


 
Johnmen   (2004-01-09 16:26) [5]

Всё можно :)

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


 
Term   (2004-01-09 16:31) [6]


> или сделать временную таблицу с полем ID_1 со значениями
> например 0-100, Потом присоеденить ее

из той же оперы
сделать таблицу в которой ID от 0 до max(id) и потом

SELECT * FROM Table1 WHERE ID NOT IN (SELECT ID FROM Table2)

токо это извращение помоему


 
Stas   (2004-01-09 16:38) [7]

Term © (09.01.04 16:31) [6]
токо это извращение помоему


Согласен
Johnmen © (09.01.04 16:26) [5]
придумал получше !
Если это работает, то лучше 100% !


 
Academic   (2004-01-09 16:45) [8]

После некоторой коррекции (просто Join не поддерживается),
запрос удалось запустить. Но с 1000 не дает результата. со 100000
выполняется уже 10 мин (MS Access)


 
Academic   (2004-01-09 16:46) [9]

Сработало!!!


 
SergP   (2004-01-09 18:31) [10]

Вообще мне вариант Johnmen © (09.01.04 16:26) [5]
больше нравится. Но проверить в работе будет возможность только поздно вечером. Так что пока не могу сказать работает или нет.

В любом случае, большое спасибо всем!
А то я уж было думал перебирать это все в цикле...


 
SergP   (2004-01-09 18:42) [11]


> Johnmen © (09.01.04 16:26) [5]
> Всё можно :)
>
> 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


Кстати 1000 - это что?
А Если у меня в базе будут id большие чем 1000?
К тому же не обязательно запрос должен быть один.
В принципе меня устроит даже если сначала одним запросом определятся макс и мин. а следующим те числа которые мне нужны (если конечно так будет лучше в смысле быстродействия).

Хотя для меня главное чтобы не делать это в цикле перебором, а то ИМХО так будет очень тормознуто...


 
Johnmen   (2004-01-10 15:15) [12]

>SergP © (09.01.04 18:42)
>Кстати 1000 - это что?

Это просто когда, к примеру, не нужны "дырки" выше 1000.
В общем случае просто убери условие...



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

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

Наверх





Память: 0.47 MB
Время: 0.008 c
3-2015
Sharker
2004-01-09 21:01
2004.02.02
Как подключаться к MS-SQL server в интернете?


14-2355
Can_kill
2004-01-10 05:31
2004.02.02
Паскаль


7-2379
Duk_777
2003-11-15 10:27
2004.02.02
DLL


14-2322
ZDima
2004-01-11 18:21
2004.02.02
Помогите


14-2340
Nomolos
2004-01-10 23:18
2004.02.02
Какой принтер выбрать?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский