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