Форум: "Базы";
Текущий архив: 2003.08.11;
Скачать: [xml.tar.bz2];
ВнизДобавление записей из одной таблицы в другую... Найти похожие ветки
← →
reticon (2003-07-17 17:12) [0]Всем привет! Такой вот вопрос:
Имеется две таблицы: ТАБ_1 и ТАБ_2.
Из ТАБ_1 должны добавлятся записи в ТАБ_2, причем таким образом, что если такая запись уже существует, то не добавлять ее в конец таблицы, а просто в отдельном поле суммировать их общее количество. Если же такой записи в ТАБ_2 еще нет, то добавлять обычным способом, например, Append.
Каким образом это сделать проще всего? Может как нибудь через уникальное поле ID проверять, есть ли запись с таким номером, если есть, то добавлять в конец таблицы, как новую запись, если нет, то прибавлять к существующей.
Какие будут предложения?
Спасибо.
← →
Sandman25 (2003-07-17 17:15) [1]Проверить наличие записи (Select count(*) from table where id = :id).
Если запись есть, то update table set field = field + :field where id = :id.
Иначе insert into table values (:id, :field, ...)
← →
reticon (2003-07-17 18:25) [2]параметрический запрос не хочет работать, якобы некоторые элементы, такие как имена столбцов и таблиц, в SQL-операторе нельзя заменять параметрами.
Пробовал через функцию Format - тоже не идет.
Попробую объяснить подругому.
Имеется две таблицы: Table1 и Table2.
Table1 и Table2 имеют поля Id, Name и Quantity.
Необходимо при выборе поля Name из Table1 проверять, имеется ли оно (с таким Id) в таблице
Table2. Если да, то суммировать значения полей Quantity в таблицах и результат помещать в поле Quantity таблицы Table2. Если же нет, то просто добавлять запись в конец таблицы Table2.
Надеюсь понятно объяснил.
Как можно сделать проще?
Спасибо.
← →
Sandman25 (2003-07-17 18:50) [3]Можно обойтись без параметров.
procedure Form1.MergeTables(Id: integer);
begin
with Query1 do
begin
Close;
SQL.Clear;
SQL.Add("select id from table1 where id =" + IntToStr(Id));
Open;
if Fields[0].AsInteger = 0 then
begin
Close;
SQL.Clear;
SQL.Add("insert into table1 select * from table2");
ExecSQL;
end
else
begin
Close;
SQL.Clear;
SQL.Add("update table2 set quantity = quantity"
+" + (select quantity from table1 where id ="
+IntToStr(Id)+") where id = " + IntToStr(Id));
{
если верхняя команда не поддерживается Paradox, то придется считывать Quantity из table2, рассчитывать сумму в Delphi и записывать ее обратно в базу командой вида SQL.Add("update table2 set quantity="+IntToStr(NewQuantity)+" where id =" +
IntToStr(Id))
}
ExecSQL;
end;
end;
end;
← →
Sandman25 (2003-07-17 18:52) [4]Ошибся.
Конечно, надо
SQL.Add("select count(*) from table1 where id =" + IntToStr(Id));
вместо
SQL.Add("select id from table1 where id =" + IntToStr(Id));
← →
Sandman25 (2003-07-17 18:56) [5]Проще можно сделать, если пытаться сразу вставить новую запись, при этом имея в таблице уникальный индекс по id.
В случае ошибки (в области except конструкции try-except-end) выполнять update.
← →
reticon (2003-07-17 19:52) [6]Блин..я не правильно тебе все объяснил... =)
Ладно, потом сформулирую правильно вопрос и скажу, если ты не против.
Все равно спасибо за помощь
← →
MsGuns (2003-07-17 20:01) [7]>Sandman25 © (17.07.03 18:56)
Зачем же так (в режиме таблицы) ? Почему нельзя двумя последовательными запросами
1.UPDATE ... SET ... SELECT ... WHERE T1.id=T2.id
2.INSERT ... SELECT ... WHERE T1.id NOT IN SELECT ...
?
← →
reticon (2003-07-17 21:32) [8]Вот!!! Сейчас наконец-то правильно высказался =)
Короче, имеется таблица с полями Id, Name, Quantity.
Также имеются:
DBEdit1, в который записываем строку. DBEdit1 связан с полем Name.
DBEdit2, в который записываем число. DBEdit2 связан с полем Quantity.
Допустим, заносим в таблицу запись. Так.
Теперь заносим следующую запись, и если значение в DBEdit1 присутствует в поле Name, то
суммируем значение из DBEdit2 со значением из поля Name и записываем это все в таблицу.
Если же значение не совпадает, то просто добавляем запись в коенц таблицы.
Мда..вот так.
Просто уже незнаю скока парюсь с этим SQL.
Как такое осуществить?
Спасибо.
← →
MsGuns (2003-07-17 23:45) [9]Осталось только расколоть тебя о том, какие компоненты используешь. Для полной ясности, тассазать ;))
← →
reticon (2003-07-18 00:22) [10]> MsGuns © (17.07.03 23:45)
Компоненты обычные - cо страниц BDE, Data Access и Data Controls
;))
В частности Table, DataSourse и др =)
Так как все таки замутить такую штуку?
← →
ЮЮ (2003-07-18 05:58) [11]А если в таблице ТАБ_1 изменится имя, кто должен следить за изменением записей в ТАБ_2?
По-моему ТАБ_2 вообще не нужна, а нужный результат всегда можно получить запросом
SELECT Name, COUNT(Name) Quantity FROM Table1 GROUP BY Name
← →
VAleksey (2003-07-18 10:54) [12]TBatchMove + F1
← →
Sandman25 (2003-07-18 12:11) [13]MsGuns © (17.07.03 20:01)
В том варианте, что я написал, если insert пройдет, то не надо будет делать update. Получаем выигрыш в скорости.
ЗЫ. Если Вы будете анализировать RowsAffected Вашего update, то Insert тоже может не понадобиться.
← →
alex_bredin (2003-07-18 13:24) [14]
> reticon © (17.07.03 21:32)
> Вот!!! Сейчас наконец-то правильно высказался =)
>
> Короче, имеется таблица с полями Id, Name, Quantity.
> Также имеются:
> DBEdit1, в который записываем строку. DBEdit1 связан с полем
> Name.
> DBEdit2, в который записываем число. DBEdit2 связан с полем
> Quantity.
>
> Допустим, заносим в таблицу запись. Так.
> Теперь заносим следующую запись, и если значение в DBEdit1
> присутствует в поле Name, то
> суммируем значение из DBEdit2 со значением из поля Name
> и записываем это все в таблицу.
> Если же значение не совпадает, то просто добавляем запись
> в коенц таблицы.
>
> Мда..вот так.
> Просто уже незнаю скока парюсь с этим SQL.
>
> Как такое осуществить?
>
> Спасибо.
Вообще в корне неправильный подход.
1.Надо завести справочник Id,Name
2.И таблицу наличия(состояния) Id,Quantity
3.Связать таблы по ID
3.Осуществлять не ввод а выбор имени из справочника(иначе у тебя появится множество дублей).
4.Если оно отстуствует, реализовать ввод нового значения в справочник, а уж потом выбрать его и вводить Quantity и потом его суммировать с пред. значением.
Во как я бы делал.
← →
reticon (2003-07-18 17:53) [15]> alex_bredin © (18.07.03 13:24)
Две таблицы? Зачем?
Ведь, допустим при удалении записи из справочника, нужно удалять слоответствующую запись из таблицы состояния. Вроде так, или я ошибаюсь? Хотя, если они связаны...
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.08.11;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.006 c