update с вложенным selectом

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Necrz
Новичок
Сообщения: 24
Зарегистрирован: 06 фев 2014, 11:30

update с вложенным selectом

Сообщение Necrz »

Добрый день!
Подскажите пожалуйста.
Есть запрос:

Код: Выделить всё

select mc.fname,
(select atr.fvdouble
from gal_vek.attrval atr
where
mc.fnrec = atr.fcrec
and atr.fcattrnam = '800100000000156D'
)
from
gal_vek.katmc mc
where
mc.fname like '%Best 4 you%'
Который выдает перечень МЦ из одной серии и значение внешнего атрибута. Надо сделать апдэйт значений этого внешнего атрибута, занести туда свои значения. При этом сейчас значения атрибутов не заполнены. Каким образом можно сделать update в таком вложенном селекте? Спасибо.
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Re: update с вложенным selectом

Сообщение Алексей »

запросом из саппорта не сделаешь. значений нет - значит не апдейт а инсерт нужен.
Necrz
Новичок
Сообщения: 24
Зарегистрирован: 06 фев 2014, 11:30

Re: update с вложенным selectом

Сообщение Necrz »

Я делаю не в саппорте, а в PL/SQL Developere. В таблице есть столбец с этим внешним атрибутом, но он не заполнен. Нужно использовать в этом случае инсерт, а не апдэйт? Если да, то как это сделать?
Алексей писал(а):запросом из саппорта не сделаешь. значений нет - значит не апдейт а инсерт нужен.
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Re: update с вложенным selectом

Сообщение Алексей »

не силён в запросах, но одно могу сказать точно, attrval заполняется только при наличии атрибута к МЦ, в противном случае записи в таблице нет.
Я бы накидал простой интерфейс.
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: update с вложенным selectом

Сообщение edward_K »

Думаю что без разницы - в PL|SQL или в сапорте - сделайте Attrval главной и все сразу будет понятней. Насколько хорошо использование вложенных запросов обсуждать не буду, но здесь они вам явно лишние.
В сапорте я бы разбил на следующие этапы.
1. Обновить attrval // если он не главный, сгенерить текстовый файл с update attrval where (( ?????? == nrec )) set ????:= ?????? ;
2. Сгенерить attrval , там где его нет - либо сформировать dbf c нужными полями и грузануть с ключами(без nrec!) nfs, либо через insert into attrval (список полей) select .... ;
Necrz
Новичок
Сообщения: 24
Зарегистрирован: 06 фев 2014, 11:30

Re: update с вложенным selectом

Сообщение Necrz »

Что значит "сделать Attrval главной"? Опыта мало в этом деле, поэтому поподробнее если можно
edward_K писал(а):Думаю что без разницы - в PL|SQL или в сапорте - сделайте Attrval главной и все сразу будет понятней. Насколько хорошо использование вложенных запросов обсуждать не буду, но здесь они вам явно лишние.
В сапорте я бы разбил на следующие этапы.
1. Обновить attrval // если он не главный, сгенерить текстовый файл с update attrval where (( ?????? == nrec )) set ????:= ?????? ;
2. Сгенерить attrval , там где его нет - либо сформировать dbf c нужными полями и грузануть с ключами(без nrec!) nfs, либо через insert into attrval (список полей) select .... ;
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: update с вложенным selectом

Сообщение edward_K »

как то так
update attrval from attrval inner join katmc on katmc.nrec =attrval.crec еще чего то
where attrval.cattrnam=?????????? and ?????? set ....;
поищите в инете "update в PL/SQL"
вот здесь например http://baks.gaz.ru/oradoc/firststeps/oracle/r48.htm
А вообще лучше таблы в галке править с помощью же галки(сапорта). Так конечно много делают тригеры, но может быть своя специфика.
Necrz
Новичок
Сообщения: 24
Зарегистрирован: 06 фев 2014, 11:30

Re: update с вложенным selectом

Сообщение Necrz »

Как я понял, мне нужно в таблицу attrval добавить столбец с внешним атрибутом. Как это можно сделать, чтобы потом он показывался в галактике во внешних атрибутах мц?
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: update с вложенным selectом

Сообщение edward_K »

выражайтесь точнее. Причем тут столбец? может быть запись? На существующие заполнить либо vstring либо плюс другие поля - зависит от типа атрибута
Для вставки вы должны заполнить wtable, cattrnam, crec +значения по update. Nrec должен сгенерится в автомате, но в PL|SQL не факт что это произойдет, и тогда вы попали.
Вообще в галактике есть такая вещь как журнализация - создайте ВА руками - увидите все что нужно.
Necrz
Новичок
Сообщения: 24
Зарегистрирован: 06 фев 2014, 11:30

Re: update с вложенным selectом

Сообщение Necrz »

Задача проста: Я создал новый внешний атрибут в Галактике. Мне нужно заполнить для нескольких сотен МЦ значение этого нового внешнего атрибута. Видимо нужно использовать инсерт. Как это сделать?
Zver
Местный житель
Сообщения: 204
Зарегистрирован: 13 ноя 2012, 12:47
Откуда: СПб
Контактная информация:

Re: update с вложенным selectом

Сообщение Zver »

Попробую объяснить более подробно.
Атрибут это просто запись в двух таблицах, а именно:
ATTRNAM - здесь хранится сам атрибут, ATTRNAM.Name - здесь хранится название атрибута, ATTRNAM.wTable - номер таблицы, в Вашем случае KatMC
ATTRVAL - здесь уже хранятся значения атрибутов для конкретных записей таблицы, которая указана в поле AttrNam.wTable.
Как работать с ATTRVAL.
В ATTRVAL.cAttrNam хранится ссылка на атрибут, то есть AttrNam.Nrec,
В ATTRVAL.cRec - здесь ссылка на nrec таблицы, в вашем случае - KAtMc.nrec.
В полях VSTRING, VDOUBLE и т.д. хранится само значение атрибута.

Как и что делать.
1) у вас уже создана запись в ATTRNAM, так что надо найти её nrec.
2) для тех МЦ, для которых нужно добавить\изменить атрибут:
2.1) пытаемся найти значение атрибута по связке
AttrNam.Nrec == AttrVal.cAttrNam
and katMC.Nrec == AttrVal.cRec
Если нет такой записи - создаём её,
если нет и нужно изменить - то меняем.

Если говорить о большом количестве записей (несколько сотен), лично мне проще сделать через импорт из файла Excel написав код на Vip, но это уже личные предпочтения.
Программист-самоучка
Necrz
Новичок
Сообщения: 24
Зарегистрирован: 06 фев 2014, 11:30

Re: update с вложенным selectом

Сообщение Necrz »

Zver, спасибо большое Вам за объяснение, я это все понимаю теоретически.

Допустим есть МЦ, для которой нужно добавить значение атрибута и это значение должно быть равно 21.5. Делаю инсерт:
insert into gal_vek.attrval (fvdouble) values (21.5)
Добавляется запись в столбце fvdouble, значение которой равно 21.5.
Как мне теперь эту запись связать с моей МЦ и нреком attrnam? Чтобы при просмотре атрибутов этой МЦ там в соответствующей ячейка показывалось значение 21.5.
m0p3e
Местный житель
Сообщения: 1386
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Re: update с вложенным selectом

Сообщение m0p3e »

Attrval.wTable = coKatMc = 1411
AttrVal.cAttrnam = AttrNam.nrec
AttrVal.cRec = KatMc.nrec
Zver
Местный житель
Сообщения: 204
Зарегистрирован: 13 ноя 2012, 12:47
Откуда: СПб
Контактная информация:

Re: update с вложенным selectом

Сообщение Zver »

Лучше сделать так:
Сначала находим нрек записи в Attrnam:

Код: Выделить всё

Select
	T$ATTRNAM.F$NREC
	, F$NAME
from
	T$ATTRNAM
where
	T$Attrnam.F$WTABLE = 1411
	and T$Attrnam.F$NAME = 'Имя нужного атрибута'
Затем делаем вставку записи в таблицу AttrVAl:
Insert into AttrVAl (F$cAttrnam, F$crec, F$vdouble) values (AttrNam.Nrec из первого запроса, KAtMC.nrec - для которой делаем, 21,5)
Раз у Вас много записей, можно попробовать в Excel с помощью сцепки сформировать для каждой МЦ соответствующий запрос.
Программист-самоучка
Necrz
Новичок
Сообщения: 24
Зарегистрирован: 06 фев 2014, 11:30

Re: update с вложенным selectом

Сообщение Necrz »

Вот! Теперь стало понятно, спасибо большое! Сейчас буду пробовать.
Zver писал(а):Лучше сделать так:....
Ответить