Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.02;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.016 c
3-1984
Aleksandr
2004-01-08 13:12
2004.02.02
Как в ClientDataSet организовать выборку из ClientDataSet ов.


3-1990
Layner
2004-01-06 08:49
2004.02.02
PHP4(FreeBSD) + MSSQL2000. Даты.


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


4-2427
Kinder
2003-11-24 18:25
2004.02.02
Добавление кнопки в заголовок


14-2339
Igorek
2004-01-06 09:44
2004.02.02
А почему, собственно, так получилось...