Форум: "Базы";
Текущий архив: 2006.03.12;
Скачать: [xml.tar.bz2];
ВнизДобавить выбранные по определенному условию записи в эту жтаблицу Найти похожие ветки
← →
ThreeTONE (2006-01-20 10:48) [0]Paradox 7_0, Delphi 6.
нужно выбрать набор записей, изменить значение определенного поля всех выбранных записей и добавить в конец этой же таблицы.
задача на первый взгляд почти тривиальная, на справиться не могу - подскажите пожалуйста как выйти из положения.
я пробовал через TQuery:
INSERT INTO table1 (a,b,c,) VALUES
SELECT FROM table1 WHERE a ="xxx"
или что-то похожее, на память плохо помню, но факт в том что запрос написан правильно, а выполняться - не хочет. сообщается, что "capasibles not cupported" . как быть?
← →
Sergey13 © (2006-01-20 10:56) [1]INSERT INTO table1 (a,b,c)
SELECT a,b,c FROM table1 WHERE a ="xxx"
Только где тут изменение "определенного поля"? Так просто дубли будут, если уникальности по ним нет.
← →
Johnmen © (2006-01-20 10:57) [2]У тебя ошибка в синтаксисе INSERT INTO
См. LocalSQL.hlp
← →
Johnmen © (2006-01-20 10:58) [3]>Sergey13 © (20.01.06 10:56) [1]
Типа того
..... SELECT a+1234,b,c .....
← →
Sergey13 © (2006-01-20 11:03) [4]2[3] Johnmen © (20.01.06 10:58)
Я же не у тебя спрашивал, а у автора. Типа, предупредить хотел. 8-)
← →
ThreeTONE (2006-01-20 11:18) [5]я решил сначала отработать задачу № 1 - просто добавить в конец таблицы выборку данных.
запрос написан _правильно_, я сейчас в инете с чужой машины, и на память вспомнить его не могу.
а про изменен данных - у меня такая идея:
запомнить мксимальное значение счетчика для эотй таблицы до вставки, а после вставки сделать запрос что то типа
update tables1 set .... where id > counter
можно так?
или есть способ получше?
← →
Плохиш © (2006-01-20 11:28) [6]
> ThreeTONE (20.01.06 11:18) [5]
Читать [3] долго и внимательно, до озарения.
← →
Sergey13 © (2006-01-20 11:29) [7]2[5] ThreeTONE (20.01.06 11:18)
>можно так?
Можно и так, если гарантируется, что больше никто не работает с БД и нет уникальности по этим полям. Но лучше ИМХО, если возможно, как у [3] Johnmen © (20.01.06 10:58)
← →
msguns © (2006-01-20 11:30) [8]В одном DML-запросе можно выполнить операцию только одного типа (UPDATE,INSERT,DELETE) и только над одной таблицей.
В твоем случае надо сначала выбрать записи из таблицы в другую таблицу (временную), затем изменить данные в этой таблице и затем измененные записи временной таблицы добавить в основную и удалить временную. Можно всю эту "этажерку" запихать в скрипт.
Это если работать "чисто" через SQL-запросы.
Можно сделать "через" клиента, выбрав на него записи из основной таблицы, затем по очереди в датасете изменить их и отдельными SQL-запросами с параметрами добавить в исходную таблицу.
Если бы вместо парадокса был сиквель-сервер, всю эту фигню можно было б засунуть в хранимую процедуру.
← →
msguns © (2006-01-20 11:33) [9]>ThreeTONE (20.01.06 11:18) [5]
>можно так?
Ни в коем случае ! Как же ты будешь идентифицировать в запросе только что добавленные новые записи, если они НИЧЕМ НЕ ОТЛИЧАЮТСЯ от старых ?
← →
Sergey13 © (2006-01-20 11:38) [10]2 [8] msguns © (20.01.06 11:30)
Перестраховщик. Тормоза придумали трУсы. 8-))))))))))))
ИМХО, достаточно забэкапить исходную таблу "на всякий пожарный случай".
← →
msguns © (2006-01-20 11:38) [11][3] проходит в том случае, если поля ВСЕХ добавляемых дубликатов записей должны измениться на одну и ту же величину или по одной и той же строго "горизонтальной" функции.
Типа
Insert ...
Select a+b-c, d*e-a..
Вы уверены, что дело обстоит именно так ?
← →
Плохиш © (2006-01-20 11:40) [12]
> msguns © (20.01.06 11:38) [11]
> Вы уверены, что дело обстоит именно так ?
Предлагаешь по-медитировать?
← →
msguns © (2006-01-20 11:47) [13]>Плохиш © (20.01.06 11:40) [12]
>Предлагаешь по-медитировать?
Нет. Я предлагаю делать политически корректно.
Сама постановка вопроса, ИМХО, несколько странноватая. Хотя промоделировать нечто похожее возможно. Например, задачка создание нового детализированного документа (хотя бы накладной) на базе имеющегося.
Перед выборкой из исх.таблицы дается блокировка чтобы кто-то другой не смог удалить "наши" записи, после чего выполняется отбор "накладной" во временную таблицу, а исходная разблокируется.
В результата можно получить точную "копию" накладной даже в том случае, если Маша по соседству его удалила или изменила.
Но это все, конечно, для локальных БД ;)
← →
ThreeTONE (2006-01-20 14:01) [14]2 msguns © > записи будут отличаться значением автоинкрементного поля, так что отличить их я думаю будет возможно.
с базой будет работать только один клиент (гарантированно), а изменяться будут текстовые поля, так что "... SELECT a+1234,b,c ....." к сожалению не прокатит...
"В одном DML-запросе можно выполнить операцию только одного типа (UPDATE,INSERT,DELETE) и только над одной таблицей." скрипт я написал , но его TQuery выполнять - не хочет. сообщается, что "capasibles not cupported" и все.
спасибо за ответы :)
← →
ThreeTONE (2006-01-20 14:01) [15]2 msguns © > записи будут отличаться значением автоинкрементного поля, так что отличить их я думаю будет возможно.
с базой будет работать только один клиент (гарантированно), а изменяться будут текстовые поля, так что "... SELECT a+1234,b,c ....." к сожалению не прокатит...
"В одном DML-запросе можно выполнить операцию только одного типа (UPDATE,INSERT,DELETE) и только над одной таблицей." скрипт я написал , но его TQuery выполнять - не хочет. сообщается, что "capasibles not cupported" и все.
спасибо за ответы :)
← →
msguns © (2006-01-20 14:42) [16]>ThreeTONE (20.01.06 14:01) [14]
>записи будут отличаться значением автоинкрементного поля, так что отличить их я думаю будет возможно.
Записи-то будут отличаться, но невозможно будет установить однозначное соответстве пар "старая запись" - "новая запись" ибо автоинкременты, привоенные при вставке НЕИЗВЕСТНЫ.
>скрипт я написал , но его TQuery выполнять - не хочет. сообщается, что "capasibles not cupported" и все.
Я же писал, для выполнения скриптов следует использовать спец.средства.
Либо самому "ручками" последовательно запускать запросы, например в SQL-эксплорере.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2006.03.12;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.011 c