Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.11.17;
Скачать: [xml.tar.bz2];

Вниз

Как быстро найти запись с заданным порядковым номером   Найти похожие ветки 

 
Виталя   (2003-10-27 13:55) [0]

Нужно найти запись в табл. с заданным порядковым номером, пишу запрос
select ID
from Tabl Q1
where :RECNO = (select count(*)
from Tabl Q2
where Q2.ID <= Q1.ID)
into :ID;
Но на моей табл. на 2000 записей это зависает секунд на 15. Может есть другие средства, чтобы скорость увеличить ?


 
Oleon   (2003-10-27 15:26) [1]

А зачем тебе номер записи? О чем он тебе может рассказать?


 
Zacho   (2003-10-27 15:29) [2]

Есть. SELECT * FROM MY_TABLE WHERE ID=:ID
Если это не то, то объясни подробно, что такое "порядковый номер".
Hint: таблица в RDBMS - это неупорядоченное множество.


 
Виталя   (2003-10-27 15:49) [3]

>> Oleon
Просто нужно чтобы пользователь мог видеть на каком номере записи он находится и мог перейти к записи с зад. номером.
(специфика такая что это очень надо)
>> Zacho
ID получается с исп. генератора, значит если вначале создали записи с ID 1 2 3 4 5 6 7, а потом удалили с ID = 4 , то последов. ID будет 1 2 3 5 6 7, а мне нужно чтобы были порядковые номера 1(ID=1) 2(ID=2) 3(ID=3) 4(ID=5) 5(ID=6) 6(ID=7).


 
Mike Kouzmine   (2003-10-27 15:50) [4]

Делай ХП


 
Виталя   (2003-10-27 15:57) [5]

>>Mike Kouzmine
Ну так я ее и делаю !- тот код что вначале это и есть кусок ХП!
И вот такие вот результаты ...


 
Sandman25   (2003-10-27 16:02) [6]

Можно попробовать так:

i = :RecNo;
for select id from table order by id
i = i - 1;
if i = 0 then
exit for;
end if
end for

PS. Написал на сам-не-знаю-чем, но идея должна быть понятна.


 
Виталя   (2003-10-27 16:17) [7]

>> Sandman25
Если ты имел ввиду это
for select ID
from quetionsletter
order by ID
into :ID
do
begin
if (:ID = :RECNO) then
SUSPEND;
end
то супер работает и правда очень быстро!


 
Sandman25   (2003-10-27 16:24) [8]

[7] Виталя © (27.10.03 16:17)

Нет, я имел ввиду не это. Таким образом Вы находите, то же, что и
select id from tables where id = :recno, или еще точнее, всегда получаете :recno.
А в моем посте я писал о том, как найти N-ую (=:RecNo) по порядку id запись.
Возможно, так будет понятнее моя идея:
with Table do
begin
First;
for I := 1 to N do
Next;
end;


 
Danilka   (2003-10-27 16:27) [9]

1. это на самом деле не нужно - постановка задачи хромает
:))
2. как ни крути, а если учитывать [3] то индексы участвовать не будут, сабж возможен только перебором всех записей, до нужного номера, а значит, надо править п.1


 
stud   (2003-10-27 16:51) [10]

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


 
Johnmen   (2003-10-27 17:08) [11]

i=1
for select .... do
if (i=myno) then begin suspend exit end
else i=i+1

знаки препинания расставь сама :)


 
Zacho   (2003-10-27 21:24) [12]

2 Виталя © : Поверьте мне, это не нужно. Абсолютно. Лучше забудьте вообще про какие-либо "номера записей". Нет их. И не нужны они.
А "бездырочная нумерация" - это совсем другая проблема, решаемая с помощью SNAPSHOT TABLE STABILITY WAIT с явным резервированием таблицы.


 
Виталя   (2003-10-28 14:47) [13]

В общем прошу прощения за молчание - в итоге я сделала такое

1. создала ХП

CREATE PROCEDURE SREZ_Tabl (
RECNO INTEGER)
RETURNS (
ID INTEGER)
AS
declare variable DIAP INTEGER;
BEGIN
select max(ID)-count(ID)
from Tabl
into :DIAP;

for select ID
from Tabl
where (ID >= :RECNO)and(ID<=:RECNO+:DIAP)
into :ID
do
SUSPEND;
END

2. а после этого написала то что вначале

CREATE PROCEDURE Tabl_RECNO (
RECNO INTEGER)
RETURNS (
ID INTEGER)
AS
BEGIN
select ID
from srez_Tabl(:RECNO) A1
where :RECNO = (select count(*)
from Tabl A2
where A2.ID <= A1.ID)
into :ID;
SUSPEND;
END

так как теперь программе не нужно склеивать 2 табл по 2000 записей, а нужно склеить одну на 2000 , а другую на 10-20(думаю в ближ. будущем большей разницы не предвидется)
то она работает очень быстро.

Всем спасибо за конструктивные советы.

>> Zacho
может скажешь где можно почитать про "бездырочную нумерацию" ?


 
Zacho   (2003-10-28 15:20) [14]


> может скажешь где можно почитать про "бездырочную нумерацию"
> ?

В архиве этого форума. Неоднократно уже было, и я несколько раз подробно описывал способ с SNAPSHOT TABLE STABILITY



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2003.11.17;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.009 c
8-56776
esidenko
2003-07-21 17:09
2003.11.17
Кто-нибудь работал с видеоформатом


1-56634
Maverico
2003-11-07 20:51
2003.11.17
Размер файла


1-56563
Zheks
2003-11-06 13:41
2003.11.17
Заполнение всех Edit_ов на форме


3-56524
exciter__
2003-10-27 09:30
2003.11.17
Interbase и DECLARE CURSOR.


1-56708
Denis
2003-11-07 09:36
2003.11.17
Структура NOTIFYICONDATAW





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский