Форум: "Базы";
Текущий архив: 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