![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Найти дырки в таблице [D6]
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)
я про промежуток с "дырками" более одной.