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

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

Поиск значения, отсутствующего в таблице [D7, Win95/98]


Алхимик ©   (2004-08-18 15:11:00) 

Дана таблица (FireBird):

SYSNM    INTEGER NOT NULL PK,
DATEREL  DATE,
TABNM    INTEGER

Задача:
Максимально быстро найти такое число M > заранее заданного N,
которое не равно SYSNM из таблицы.

Варианты окромя перебора есть?


Zacho   (2004-08-19 02:13:00) [1]

2 Алхимик © :
Завтра я уезжаю на несколько дней, а очень интересно как мои умозрительные построения работают на практике. Так что если не трудно, продублируй реэультаты мне на мыло :)


Алхимик   (2004-08-19 01:53:00) [2]


> Покажи полностью запрос

[7] без подчёркнутой строки

> а запрос в   [6] - правильный, должен работать независимо
> от данных.

Завтра погоняю, погляжу.


Zacho   (2004-08-19 01:50:00) [3]

2 Алхимик ©   (19.08.04 1:38)
Покажи полностью запрос. Ибо, как нетрудно заметить :) запрос в Zacho ©   (18.08.04 23:43) [4] и запрос в Zacho ©   (19.08.04 0:33) [6] отличается не только наличием WHERE. В общем, запрос [4] - неправильный, хотя и будет работать в нек-рых случаях, а запрос в   [6] - правильный, должен работать независимо от данных.
Что касается +1 - на что это заменять и сам разберёшся, видно, что не дурак :)


Алхимик   (2004-08-19 01:38:00) [4]


> [8] Zacho ©   (19.08.04 01:30)

Дык накидал примерчик. Единицу заменил на моё приснопамятное N из [0].
Находит то что надо. Где у меня ошибка? :)


Zacho   (2004-08-19 01:30:00) [5]

Обязательно, в нём то всё дело.


Алхимик   (2004-08-19 01:29:00) [6]

[6] Zacho ©   (19.08.04 00:33)
SELECT MIN(T.SYSNM)+1 FROM MY_TABLE T
LEFT JOIN MY_TABLE T2
ON T.SYSNM+1=T2.SYSNM
WHERE (T2.SYSNM-T.SYSNM) IS NULL


Условие вроде не обязательно?


Zacho   (2004-08-19 00:33:00) [7]

2 Алхимик © :
Извиняюсь, лажанулся по запарке. На самом деле запрос должен выглядеть так:

SELECT MIN(T.SYSNM)+1 FROM MY_TABLE T
LEFT JOIN MY_TABLE T2
ON T.SYSNM+1=T2.SYSNM
WHERE (T2.SYSNM-T.SYSNM) IS NULL


Если хочешь получить все дырки - убери MIN


Алхимик   (2004-08-19 00:06:00) [8]


> [4] Zacho ©   (18.08.04 23:43)
> 2 Алхимик © :
>
> Вот такой вариант поиска дырок :
>
> SELECT MIN(T.SYSNM)+1
> FROM MY_TABLE T
> JOIN MY_TABLE T2 ON T.SYSNM=T2.SYSNM+1
>
> Находит первую "дырку". Если хочешь последнюю - замени MIN
> на MAX


Спасибо. Завтра попробую. О результатах доложу. :)


Zacho   (2004-08-18 23:43:00) [9]

2 Алхимик © :

Вот такой вариант поиска дырок :

SELECT MIN(T.SYSNM)+1
FROM MY_TABLE T
JOIN MY_TABLE T2 ON T.SYSNM=T2.SYSNM+1


Находит первую "дырку". Если хочешь последнюю - замени MIN на MAX


Алхимик   (2004-08-18 23:09:00) [10]


> [2] Anatoly Podgoretsky ©   (18.08.04 15:40)
> Вести список дырок.

Угу.
Так и реализовал.


Anatoly Podgoretsky   (2004-08-18 15:40:00) [11]

Вести список дырок.


stud   (2004-08-18 15:33:00) [12]

создать генератор и использовать его значение. этого-то значения точно в базе не будет при правильном использовании генератора


Наверх

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