Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 первый и надеюсь последний раз прошу помочь написать процедуру  [new]
Алексей Кубенко
Guest
Уважаемые господа никогда не спрашивал как написать, запрос или процедуру, но вот недавно решал вот такую вот задачку, решение мое (650099) не устроило. Мне мое решение, мне даже очень понравилось, согласен есть некая неоптимальность, но и есть она по очень интересной причине про которую я пока промолчу.

Ниже привожу условие полностью как мне оно было поставлено и ответ на дополнительный мой вопрос об уточнении условия задачи. Очень интересно как другие будут решать, ну очень интересно.

Найти дырки.

Вопрос:

Имеется таблица A (id int primary key, description varchar(8000)). Таблица заполнена 1000000 записями соответственно с id от 1 до 1000000. Затем, часть записей была удалена. Нужно вывести отсутствующие id (дырки).

Вот это ответ на мой дополнительный вопрос по поводу условия задачи:

Давайте исходить из того, что в таблицу с дырками нельзя вставлять служебные записи. И результатом работы процедуры должны быть не интервалы, а просто списки всех пропущенных (отсутствующих в таблице) значений

Например, дырка, возникающая после такой операции
delete from test where rid < 100
23 ноя 05, 18:41    [2100918]     Ответить | Цитировать Сообщить модератору
 Re: первый и надеюсь последний раз прошу помочь написать процедуру  [new]
Алексей Кубенко
Guest
Я надеюсь, что найдется не мало желающих чисто из спортивного интереса написать процедуру.
23 ноя 05, 18:54    [2100988]     Ответить | Цитировать Сообщить модератору
 Re: первый и надеюсь последний раз прошу помочь написать процедуру  [new]
VladRUS.ca
Member

Откуда: Toronto
Сообщений: 1172
1. Создайте постояную вспомогательную таблицу он 1 до 1000000
2. Свяжите Вашу таблицу со вспомогательной испольэуя LEFT OUTER JOIN или RIGHT OUTER JOIN
3. Далее IS NULL в условии отбора даст желаемый результат
23 ноя 05, 18:57    [2101001]     Ответить | Цитировать Сообщить модератору
 Re: первый и надеюсь последний раз прошу помочь написать процедуру  [new]
Verbovsky Innokenty
Member

Откуда: Moscow
Сообщений: 160
SELECT q1.v + q2.v*10  + q3.v*100 + q4.v*1000 + q5.v*10000 + q6.v*100000 AS Дырка FROM
 (select 1 v union all select 2 union all select 3 union all 
  select 4   union all select 5 union all select 6 union all 
  select 7   union all select 8 union all select 9 union all select 0) q1
cross join
 (select 1 v union all select 2 union all select 3 union all 
  select 4   union all select 5 union all select 6 union all 
  select 7   union all select 8 union all select 9 union all select 0) q2
cross join
 (select 1 v union all select 2 union all select 3 union all 
  select 4   union all select 5 union all select 6 union all 
  select 7   union all select 8 union all select 9 union all select 0) q3
cross join
 (select 1 v union all select 2 union all select 3 union all 
  select 4   union all select 5 union all select 6 union all 
  select 7   union all select 8 union all select 9 union all select 0) q4
cross join
 (select 1 v union all select 2 union all select 3 union all 
  select 4   union all select 5 union all select 6 union all 
  select 7   union all select 8 union all select 9 union all select 0) q5
cross join
 (select 1 v union all select 2 union all select 3 union all 
  select 4   union all select 5 union all select 6 union all 
  select 7   union all select 8 union all select 9 union all select 0) q6
WHERE NOT EXISTS (SELECT 1 FROM A WHERE A.ID=q1.v + q2.v*10  + q3.v*100 + q4.v*1000 + q5.v*10000 + q6.v*100000)
ORDER BY q1.v + q2.v*10  + q3.v*100 + q4.v*1000 + q5.v*10000 + q6.v*100000
23 ноя 05, 19:07    [2101055]     Ответить | Цитировать Сообщить модератору
 Re: первый и надеюсь последний раз прошу помочь написать процедуру  [new]
Алексей Кубенко
Guest
Ну все на мой взгляд все варианты решений приведены, мое решение очень похоже на решение Verbovsky Innokenty, как говорится теже яй...а только вид сбоку.
Но вот меня интересует такой вопрос: я один такой(вернее нас двое я и Verbovsky Innokenty) кто не ищет легких путей и посчитал простое легкое решение за нерешение и подумал что просят без создания дополнительной таблицы. Прошу ответить честно тех, кто вникал в условие задачи.
23 ноя 05, 21:31    [2101372]     Ответить | Цитировать Сообщить модератору
 Re: первый и надеюсь последний раз прошу помочь написать процедуру  [new]
Glory
Member

Откуда:
Сообщений: 104760
Для того, чтобы вывести из таблицы то, чего там нет, нужно иметь эталонную таблицу, которая содержит все, что там может быть.
23 ноя 05, 21:43    [2101387]     Ответить | Цитировать Сообщить модератору
 Re: первый и надеюсь последний раз прошу помочь написать процедуру  [new]
Алексей Кубенко
Guest
2 Glory.
Это понятное дело что для того что бы получить некую выборку нужно изначально иметь выборку/набор данных как минимум содержащий то что необходимо иметь на выходе, отсюда получаем два варианта
1) готовая таблица
2) декартово произведение
Что первый, что второй вариант оба не хорошие, так как если рассматривать идеальный случай работающий на все случаи жизни в первом случае мы должны держать таблицу содержащую 2^32-2 записей, во втором случае дорогая операция по ее формированию.

Ну кто нибудь скажет или нет? нас двое или нет нас двое кто не ищет легких путей?
23 ноя 05, 22:01    [2101430]     Ответить | Цитировать Сообщить модератору
 Re: первый и надеюсь последний раз прошу помочь написать процедуру  [new]
Glory
Member

Откуда:
Сообщений: 104760
Динамическое формирование хуже постоянной таблицы.
Поэтому и возникает вопрос - для чего нужна именно "вывести отсутствующие id". Что вы собрались делать с набором, который может содержать много записей ? Для решения какой задачи может понадобится _весь_ список пропущенных значений ?
23 ноя 05, 22:10    [2101444]     Ответить | Цитировать Сообщить модератору
 Re: первый и надеюсь последний раз прошу помочь написать процедуру  [new]
Verbovsky Innokenty
Member

Откуда: Moscow
Сообщений: 160
Алексей Кубенко
...кто не ищет легких путей и посчитал простое легкое решение за нерешение ...
Легких для сервера или для пишущего SQL? Предложенный выше вариант выдает нужный ответ, а посему является решением
Алексей Кубенко
..и подумал что просят без создания дополнительной таблицы. Прошу ответить честно тех, кто вникал в условие задачи.
Поскольку задача очень напоминает тестовую, а в тестах обычно требуется отсутствие вспомогательных таблиц, то я именно так и подумал
23 ноя 05, 22:24    [2101463]     Ответить | Цитировать Сообщить модератору
 Re: первый и надеюсь последний раз прошу помочь написать процедуру  [new]
aleks2
Guest
https://www.sql.ru/forum/actualthread.aspx?tid=116495
24 ноя 05, 06:07    [2101790]     Ответить | Цитировать Сообщить модератору
 Re: первый и надеюсь последний раз прошу помочь написать процедуру  [new]
mekesha
Member

Откуда: Харьков
Сообщений: 300

А еще гляньте Как показать в результате дату, котрая не существует в
таблице
). А (как по мне) вариантов решения такой задачи - масса...


Posted via ActualForum NNTP Server 1.3

28 ноя 05, 12:06    [2115667]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить