Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
1-33215
Bill
2003-07-29 13:53
2003.08.11
Работа с файлом output


4-33400
Akvilon
2003-06-10 22:44
2003.08.11
Handles стандартных окошек (вроде кнопок)


3-33076
TankMan
2003-07-13 02:34
2003.08.11
Проблема хранения....


6-33234
Димос
2003-06-02 18:42
2003.08.11
Запуск почтовой программы и вставка в нее какого-то текста.


14-33271
vidiv
2003-07-16 14:16
2003.08.11
Вопрос про фреймы в HTML





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский