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

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

Обновление первых записей [D6, dBase, FoxPro]


Страницы:   1 2

skiph ©   (2005-08-31 07:51:00) 

Нужно выполнить запрос вида:
Update fkuude
SET ПОЛЕ=НОВОЕ_ЗНАЧЕНИЕ
FROM (SELECT TOP 100 *
     FROM fkuude
     WHERE некоторый запрос) AS t1
WHERE t1.ID_Rec=fkuude.ID_REC


Т.е. мне нужно изменить не все записи, соответствующие "некоторому запросу", а только первые сто. Но при выполнении этого запроса Delphi ругается на первый FROM (тот, что после SET). Похоже, что здесь он не реализован. Как по другому можно решить эту задачку? Можно, конечно, отдельно выполнить
SELECT TOP 100 *
     FROM fkuude
     WHERE некоторый запрос
а затем, для каждой строчки, производить Update, но это чрезвычайно долго!
Заранее благодарен


sniknik   (2005-08-31 11:18:00) [21]

> Почему? В t1 будут отбираться только те записи, которые отфильтровываются по притерию, следовательно для тех ID_Rec,
> которым не удалось попасть t1, равенство не будет возможным.
по этому условию построится обьеденение, неявное. и обновятся(должны) те записи для которых равенство совпадает. те. возможно обновятся даже больше 100 записей (хотя по логике ты этого не предусматривал), при условии дубликатов по условию.
но я посчитал ID_Rec уникальным и этот вариант не рассматривал.

вообщето надо бы проверить. только неохота, да и смысла для BDE все одно нет, не поддерживается. и автоинкремента у тебя нет (хоть както top сэмулировать) и движок не позволяет порядковый номер в запросеиспользовать (как VFP, для аналогичного TOP эмулировать).


Виталий Панасенко   (2005-08-31 10:59:00) [22]

procedure Top100(Tbl : TTable);
var
I : Integer;
begin
for I := 1 to 100 do
  if  not Tbl.Eof then
   begin
     Tbl.Edit;
     Tbl['ПОЛЕ'] := НОВОЕ_ЗНАЧЕНИЕ;
     Tbl.Next;
   end;//-if
end;
И по другому (запросом) не сделаешь... LocalSQL не потянет


Val   (2005-08-31 10:56:00) [23]

Думаю, что лучше работать с набором ид-шников уже выбранной сотни, при апдейте.


Sergey13   (2005-08-31 10:54:00) [24]

2[3] skiph ©   (31.08.05 10:44)
>Просто пользователь обрабатывает заиси порциями по 100 штук. Как раз этот пример должен был отмечать уже просмотренные записи, чтобы они не попали в следующую порцию.

А если двое сразу смотрят? Я не знаю твоих условий, но ты, ИМХО, не туда роешь.


skiph   (2005-08-31 10:44:00) [25]

> sniknik: Извиняюсь, на BDE я все это делаю. Оп-па, а что BDE топ вообще не поддерживает?
>ID_Rec - так понимаю ключевое вернее уникальное
под ID_Rec, я вообще-то подразумевал набор полей, которые уникально идентифицируют запись.
>а WHERE t1.ID_Rec=fkuude.ID_REC смысла не имеет, сравнивается то само с собой табличное и из запроса той же таблици, в любом случае будет равно.

Почему? В t1 будут отбираться только те записи, которые отфильтровываются по притерию, следовательно для тех ID_Rec, которым не удалось попасть t1, равенство не будет возможным. А вообще я этот пример из SQL BOL сдернул, поэтому в том, что он в MS SQL работает уверен.

>Anatoly Podgoretsky
Просто пользователь обрабатывает заиси порциями по 100 штук. Как раз этот пример должен был отмечать уже просмотренные записи, чтобы они не попали в следующую порцию.


Anatoly Podgoretsky   (2005-08-31 08:53:00) [26]

skiph ©   (31.08.05 07:51)  
Зачем нужно изменять произвольные 100 записей, смысл как бы туманен.


sniknik   (2005-08-31 08:23:00) [27]

а TOP реализован для используемого тобой движка?
тогда можно попробовать

Update fkuude
SET ПОЛЕ=НОВОЕ_ЗНАЧЕНИЕ
WHERE ID_Rec IN (SELECT TOP 100 ID_Rec
    FROM fkuude
    WHERE некоторый запрос)

ID_Rec - так понимаю ключевое вернее уникальное (т.к. dBase/FoxPro, нет ключей). (?)
а WHERE t1.ID_Rec=fkuude.ID_REC смысла не имеет, сравнивается то само с собой табличное и из запроса той же таблици, в любом случае будет равно.


Страницы:   1 2

Наверх

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