C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
вопрос по sql
telepath
Отправлено: 10.11.2004, 11:38


Станционный диспетчер

Группа: Участник
Сообщений: 132



Хочу вставить в одно поле table1 сумму двух полей table2
CODE
insert into table1 (value)
value (table2.val1 + table2.val2)

такая штука не работает, не подскажете в чем дело?
Valdemar
Отправлено: 10.11.2004, 11:49


Мастер участка

Группа: Участник
Сообщений: 433



Возможно потому, что название поля, в которое вы пишете сумму, совпадает с зарезервированным словом VALUE.
telepath
Отправлено: 10.11.2004, 12:03


Станционный диспетчер

Группа: Участник
Сообщений: 132



value это для примера
Gedeon
Отправлено: 10.11.2004, 12:13


Ветеран

Группа: Модератор
Сообщений: 1742



См. хэлп
QUOTE

INSERT INTO MyTable (PriKey, Description)
      VALUES (123, 'A description of part 123.')
AVC
Отправлено: 10.11.2004, 12:20


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE
insert into table1 (value) value (table2.val1 + table2.val2)

Как по вашему, из какой строки(строк) table2 должны браться значения?
Правильно так
Insert Into table1 (field_name) Select val1+val2 From table2 Where ...
Вставляется столько строк, сколько возвращает подзапрос (ли нужно использовать агрегатные функции)
telepath
Отправлено: 10.11.2004, 12:24


Станционный диспетчер

Группа: Участник
Сообщений: 132



Сорри, была опечатка. Код выглядит так
QUOTE
insert into LOGS (ID_REC, TYPE_CHANGE, CODE)
values (old.ID, 'change', (RESTABLE.N1 + RESTABLE.N2));

,где
ID_REC integer,
TYPE_CHANGE varchar(25),
CODE varchar(6),
N1 varchar(1),
N2 varchar(1)

А строка известна, она в переменной OLD

Отредактировано telepath — 10/11/2004, 13:27
AVC
Отправлено: 10.11.2004, 13:23


Ветеран

Группа: Модератор
Сообщений: 1583



Sorry smile.gif Книжка придавила клавишу. smile.gif

Отредактировано AVC — 10/11/2004, 13:27
AVC
Отправлено: 10.11.2004, 13:29


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE
А строка известна, она в переменной OLD

Она известна вам, но ни как не серверу. Подствьте в insert значение из своей строки (Gedeon) или заставьте сервер снова найти её (я) smile.gif
Gedeon
Отправлено: 10.11.2004, 14:04


Ветеран

Группа: Модератор
Сообщений: 1742



QUOTE (AVC @ 10/11/2004, 13:22)
Как по вашему, из какой строки(строк) table2 должны браться значения?

О, блин, а я первое что нашел и дальше смотреть даже не стал.
telepath
Отправлено: 10.11.2004, 14:19


Станционный диспетчер

Группа: Участник
Сообщений: 132



Это должно срабатывать перед изменением конкретной записи в table2 на триггере, и старое значение изменяемой строки вставляться в table1 разве в old не будет храниться запись до изменения? ohmy.gif
AVC
Отправлено: 10.11.2004, 15:21


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE

Хочу вставить в одно поле table1 сумму двух полей table2
...
разве в old не будет храниться запись до изменения?

Будет, но для table2. Т.е. в old хранятся значения полей только tabl2. Для решения проблемы вам нужно в триггере выполнить запрос типа
Upadate table1 Set field = new.val1 + new.val2 Where table1.primary_key = ...
или
Upadate table1 Set
field = field — old.val1-old.val2 + new.val1 + new.val2
Where table1.primary_key = ...

Кстати, вопрос из вашего первого поста противоречит последнему.

2Gedeon
А я, когда читал, value вместо values просто сразу не увидел biggrin.gif

Вернуться в Работа с базами данных в C++Builder