Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Найти дырки в таблице [D6]


Страницы:   1 2

Drakosha ©   (2005-09-06 18:19:00) 

Имеется таблица с уникальным полем, значения в нём должны быть
от 1 до 100.
пример
2
3
4
89
90
Необходимо получить отсутствующие номера (т.е. 1,5,6,...88,91..100)
Можно ли это сделать не привлекая дополнительную таблицу со всеми значениями от 1 до 100?


Sergey13   (2005-09-07 15:15:00) [1]

2[27] Val ©   (07.09.05 15:02)
Наверное. Лень проверять.


Val   (2005-09-07 15:02:00) [2]

ок. но тогда простой юзер вообще получит пустую выборку, так как он не owner ни одного объекта?


Sergey13   (2005-09-07 14:54:00) [3]

2[25] Val ©   (07.09.05 14:51)
>кстати, на этот обзор нужны права дба, как я понимаю.
Нет. Но для ДБА записей гораздо больше чем для простого узера. 8-)


Val   (2005-09-07 14:51:00) [4]

...понадобились "дырки" с 30 003 по 30 010... :)
кстати, на этот обзор нужны права дба, как я понимаю.


Drakosha   (2005-09-07 14:45:00) [5]


> >[20] Drakosha ©   (07.09.05 12:41)
> Не факт что в all_objects будет нужное вам количество строк.
> А выставлять для себя ограничение "без процедур, без таблиц",
> без видимых на то причин, является глупостью по-моему. Что
> называется - "Хотите гемора - нате!".

В нашем проекте в all_objects находится свыше 30 000 записей тобишь    всё нармуль.

Всем спасибо за участие и помощь.


SvetaK   (2005-09-07 14:23:00) [6]

В предпоследней строчке уточняю: вместо * надо  id
left join (SELECT id FROM MY_TABLE) t2 on nn.nn=t2.id


SvetaK   (2005-09-07 14:06:00) [7]

Для 3-ёх разрядных значений можно так попробовать...

select nn.nn from (
select  (n2.num*10+n1.num)+1 as nn from
(select 0 as num union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) n1,
(select 0 as num union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) n2
) nn
left join (SELECT * FROM MY_TABLE) t2 on nn.nn=t2.id
where t2.id is null order by 1

,а для четырёх разрядных нужно еще полторы строки напарить - успехов!


Val   (2005-09-07 13:16:00) [8]

>[20] Drakosha ©   (07.09.05 12:41)
Не факт что в all_objects будет нужное вам количество строк. А выставлять для себя ограничение "без процедур, без таблиц", без видимых на то причин, является глупостью по-моему. Что называется - "Хотите гемора - нате!".


Drakosha   (2005-09-07 12:41:00) [9]


> Lexer ©   (07.09.05 12:34) [19]
>
> Без таблиц, без процедур :)


:)
ню-ню
без таблиц имелось ввиду что я не создаю лишних или временных а юзаю какие нить уже существующие....
зы от 1 до 100 это я написал для примера...на самом деле там речь о четырёх разрядных значениях...вот я б попарился с твоим вариантом :)


Lexer   (2005-09-07 12:34:00) [10]

Без таблиц, без процедур :)
SELECT 1
 FROM EMPLOYEE WHERE NOT EXISTS (SELECT id_employee FROM EMPLOYEE WHERE id_employee = 1)
UNION
SELECT 2
 FROM EMPLOYEE WHERE NOT EXISTS (SELECT id_employee FROM EMPLOYEE WHERE id_employee = 2)
UNION
SELECT 3
 FROM EMPLOYEE WHERE NOT EXISTS (SELECT id_employee FROM EMPLOYEE WHERE id_employee = 3)
UNION
SELECT 4
 FROM EMPLOYEE WHERE NOT EXISTS (SELECT id_employee FROM EMPLOYEE WHERE id_employee = 4)
UNION
SELECT 5
 FROM EMPLOYEE WHERE NOT EXISTS (SELECT id_employee FROM EMPLOYEE WHERE id_employee = 5)
UNION
SELECT 6
 FROM EMPLOYEE WHERE NOT EXISTS (SELECT id_employee FROM EMPLOYEE WHERE id_employee = 6)
UNION
.....
.....
SELECT 100
 FROM EMPLOYEE WHERE NOT EXISTS (SELECT id_employee FROM EMPLOYEE WHERE id_employee = 100)


Drakosha   (2005-09-07 12:33:00) [11]


> Sergey13 ©   (07.09.05 12:02) [10]


Во!! То что надо! Огромное спасибо!


Drakosha   (2005-09-07 12:28:00) [12]


> Sergey13 ©   (07.09.05 12:02) [10]

Вроде то что надо!!! сейчас опробую


Drakosha   (2005-09-07 12:27:00) [13]


> Zacho ©   (07.09.05 11:41) [8]

Извиняюся ... показалося что ставил птичку на оракле


Drakosha   (2005-09-07 12:26:00) [14]

Вопрос задавал вечером и только сейчас глянул ответы.
Что ж начнём по порядку:

2Shopot ©
2Lexer ©  
Имелось ввиду не использование никаких языков программирования или хранимых процедур.


Sergey13   (2005-09-07 12:15:00) [15]

2[12] Desdechado ©   (07.09.05 12:10)
Я так думаю ограничение касалось специально созданой таблицы.
Хотя - автору, которого не видно, виднее. 8-)


Val   (2005-09-07 12:14:00) [16]

мда. в [11] я прогнал. rownuma-то не найти в других серверах :( сорри.


Desdechado   (2005-09-07 12:10:00) [17]

Sergey13 ©   (07.09.05 12:02) [10]
элегантно, но не удовлетворяет условию "не привлекая другую таблицу со всеми 1..100"


Val   (2005-09-07 12:08:00) [18]

>Sergey13 ©   (07.09.05 12:02)
Интересное решение. Думаю, можно применить к любому серверу, заменив минус на not in/not exists и константу на select max. Дело за нужной таблицей.


Sergey13   (2005-09-07 12:02:00) [19]

Вариант для Оракла
select rownum from all_objects where rownum<101
minus
select uniq_Field from My_Table

Вместо all_objects можно использовать любую таблицу/вьюху с гарантировано бОльшим 100 количеством записей.


Val   (2005-09-07 11:55:00) [20]

>[7] Anatoly Podgoretsky ©   (07.09.05 11:28)
я про промежуток с "дырками" более одной.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо