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