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

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

Вложенный запрос


Alex86 ©   (2008-09-19 12:21:00) 

Помогите объединить в один запрос тк не сильно знаком с 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;


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

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

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

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

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


Johnmen   (2008-09-19 14:23:00) [2]


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

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


Sergey13   (2008-09-19 14:09:00) [3]

> [11] Alex86   (19.09.08 13:35)

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


Johnmen   (2008-09-19 13:53:00) [4]

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


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

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


Johnmen   (2008-09-19 13:38:00) [6]


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

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


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

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


Sergey13   (2008-09-19 13:34:00) [8]

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

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


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


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

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


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

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


ЮЮ   (2008-09-19 13:05:00) [11]

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


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

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


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


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


Johnmen   (2008-09-19 13:01:00) [12]

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


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

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

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

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


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

Необходимо организовать перемещение по определленным записям в таблице (например записям с полем 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;


Palladin   (2008-09-19 12:29:00) [15]

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

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


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

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


Palladin   (2008-09-19 12:25:00) [17]

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


Наверх

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