Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.10.26;
Скачать: CL | DM;

Вниз

Вложенный запрос   Найти похожие ветки 

 
Alex86   (2008-09-19 12:21) [0]

Помогите объединить в один запрос тк не сильно знаком с sql:

SQL.Text := "SELECT MIN(ITEM_ID) FROM CONTENT WHERE (FLAGS <> 1) AND (GROUP_ID <> 0)";
Open;
 LastItem := Fields[0].AsInteger;
SQL.Text := Format("SELECT MAX(ITEM_ID) CONTENT ITEM WHERE (FLAGS <> 1) AND (GROUP_ID <> 0) AND (ITEM_ID < %d) AND (ITEM_ID >= %d)",
               [CurItemByKey, LastItem]);
   Open;


 
Palladin ©   (2008-09-19 12:25) [1]

и какая великая цель сего действия будет?


 
Alex86   (2008-09-19 12:27) [2]

Next по определенным записям в таблице


 
Palladin ©   (2008-09-19 12:29) [3]

у тебя агрегирующая функция в запросе и нет группировки
возвращатся будет всегда одна запись

ты словами опиши что ты на выходе получить хочешь, с примером


 
Alex86   (2008-09-19 12:39) [4]

Необходимо организовать перемещение по определленным записям в таблице (например записям с полем flags = 1 и полем group_id = 0). Метод должен возвращаться id записи на которую переместились. Если запись была последняя и мы вызвали методо должен возвратиться 0.

Вообщемто вот весь код метода:

function Next: Integer;
var
 LastItem: Integer;
begin
 Result := -1;
     with cmp_Query_ do
       try
         cmp_DataBase.StartTransaction;
         try
           SQL.Text := "SELECT MAX(ITEM_ID) FROM ITEM WHERE (FLAGS <> 1) AND (GROUP_ID <> 0)";
           Open;
           LastItem := Fields[0].AsInteger;
           SQL.Text := Format("SELECT MIN(ITEM_ID) FROM ITEM WHERE (FLAGS <> 1) AND (GROUP_ID <> 0) AND (ITEM_ID > %d) AND (ITEM_ID <= %d)",
             [CurItemByKey, LastItem]);
           Open;
           if Fields[0].AsInteger > CurItemByKey then
             Result := Fields[0].AsInteger
           else
             Result := 0;
           if Result > 0 then
             CurItemByKey := Result;
           except
             cmp_DataBase.Rollback;
           end;
           cmp_DataBase.Commit;
       except
         on E: Exception do
           raise;
       end
end;


 
Sergey13 ©   (2008-09-19 13:01) [5]

> [4] Alex86   (19.09.08 12:39)
> Необходимо организовать перемещение по определленным записям
> в таблице

Перемещаться можно по набору данных (он же датасет). По таблице перемещаться невозможно в принципе. У датасета есть свои методы для перемещения - Next, Prior, First, Last. По достижении конца датасета истинными становятся свойства датасета EOF и BOF.

Велосипед изобретаем что ли?


 
Johnmen ©   (2008-09-19 13:01) [6]

Перемещаться можно только по определленным записям в наборе данных. Который получен запросом недавно. А на текущий момент значения min/max в таблице уже м.б. другими.
А во-вторых, кури Eof и Bof.


 
ЮЮ ©   (2008-09-19 13:05) [7]

> Вообщемто вот весь код метода:


а код метода CurItemByKey?

И вообще зачем это?


> Необходимо организовать перемещение по определленным записям
> в таблице (например записям с полем flags = 1 и полем group_id
> = 0).


Выбрать нужные записи, а у любого DataSet-a есть свой Nехт.


 
Alex86   (2008-09-19 13:25) [8]

А если записей в таблице 500 000 и каждые 10 секунд могут изменяться другими пользователями, не делать же каждый раз выборку нужных записей (так как под условие выборки может подпадать и 200 000 и 300 000 тыс записей таблице).


 
Johnmen ©   (2008-09-19 13:28) [9]


> не делать же каждый раз выборку нужных записей (так как
> под условие выборки может подпадать и 200 000 и 300 000
> тыс записей таблице).

И зачем вдруг может понадабиться 200 000 записей сразу?


 
Sergey13 ©   (2008-09-19 13:34) [10]

> [9] Johnmen ©   (19.09.08 13:28)
> И зачем вдруг может понадабиться 200 000 записей сразу?

Проверить, а вдруг там уже 200 001. Вот и надо свом методом до нее досчитать.


 
Alex86   (2008-09-19 13:35) [11]

Вообщем есть таблица бд в которой содержаться товары у которых group_id = 1, и разделы у которых group_id = 0 (бд делал не я так что приходится работать с такой какая есть). Всего записей порядка 500 000. Так вот нужно сделать функцию которая позволила бы перемещаться только по товарам и в качестве результата возвращала id текущего товара.


 
Johnmen ©   (2008-09-19 13:38) [12]


> функцию которая позволила бы перемещаться только по товарам

Какова конечная цель "перемещения"?


 
Alex86   (2008-09-19 13:43) [13]

перемещение будет определять товар с которым впоследствии будем работать (+ для работы с товарами реализован ряд методов).


 
Johnmen ©   (2008-09-19 13:53) [14]

Как это перемещение может что-то определять???


 
Sergey13 ©   (2008-09-19 14:09) [15]

> [11] Alex86   (19.09.08 13:35)

Т.е. полмиллиона записей классифицирутся только флагом группа/раздел?
Разделов, я полагаю, немного, штук 100-200. и 499800 товаров. И по ним по всем перемещаться?
Шикарно! 8-)


 
Johnmen ©   (2008-09-19 14:23) [16]


> Sergey13 ©   (19.09.08 14:09) [15]
> Шикарно! 8-)

Щикарно (с) ЮП


 
ANB   (2008-09-19 15:24) [17]

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

Хотя иногда вылезает необходимость ходить туда - сюда по большой таблице.

Но это надо писать свой навигатор.

В таблице обязательно должно быть поле ID. Сортировка при навигации будет тогда только по нему. Или надо будет изобретать хитрый ключ для сортировки.
А дальше все просто - храним на локале ID начала и конца окна и вовремя выполняем запросы для его перемещения.



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

Текущий архив: 2008.10.26;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.024 c
4-1198486278
lead-in
2007-12-24 11:51
2008.10.26
функции RAS


15-1220381821
xayam
2008-09-02 22:57
2008.10.26
Восстановление файловой таблицы NTFS - MFT


2-1221833280
Alexei
2008-09-19 18:08
2008.10.26
Запуск приложения


2-1221546073
dmitry_12_08_73
2008-09-16 10:21
2008.10.26
Определение идентификатора потока


15-1220362249
palva
2008-09-02 17:30
2008.10.26
Эту ветку даже открыть не могу