![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Коррелированный запрос UPDATE
SP © (2009-03-20 18:26:00)Нужно написать запрос типа этого (этот не работает):
UPDATE card s
SET s.form =
(SELECT fr
FROM (SELECT a.code AS code, d.code AS fr
FROM card a, org b, form c, form d
WHERE a.cardyear = 2009
AND a.idorg = b.code
AND d.charcode = CONCAT ('J', SUBSTR (c.charcode, 2, 7))
AND a.form = c.code
AND SUBSTR (c.charcode, 1, 1) = 'F'
AND b.jur = 1) k
WHERE k.code = s.code)
получаю сообщение об ошибке:
[1]: (Error): ORA-01407: cannot update ("BESTZVIT"."CARD"."FORM") to NULL
если упросить запрос для лучшего понимания народом, это будет выглядеть как
update table1 a set a.field1=(select b.field1 from table2 b where b.field2=a.field2)
проблема в том, что для отдельных записей table1 подзапрос select может выдавать пустой набор данных.
Посоветуйте, как обойти проблему в данном случае.
SP (2009-03-30 17:29:00) [1]
> Кщд (27.03.09 08:41) [8]
Хм. как-то не подумал раньше про это...
Кщд (2009-03-27 08:41:00) [2]>Коммуноцентрист1 (26.03.09 10:57) [7]
UPDATE card s
SET s.form =
nvl((SELECT fr
FROM (SELECT a.code AS code, d.code AS fr
FROM card a, org b, form c, form d
WHERE a.cardyear = 2009
AND a.idorg = b.code
AND d.charcode = CONCAT ('J', SUBSTR (c.charcode, 2, 7))
AND a.form = c.code
AND SUBSTR (c.charcode, 1, 1) = 'F'
AND b.jur = 1) k
WHERE k.code = s.code), s.form)
Коммуноцентрист1 (2009-03-26 10:57:00) [3]
> Кщд (26.03.09 10:52) [6]
некуда тут nvl запихать
Кщд (2009-03-26 10:52:00) [4]>SP (20.03.09 18:26)
используйте nvl
>Коммуноцентрист1 (20.03.09 21:57) [3]
это Вы учите плохому)
в использовании merge, в данном случае, нет никакой нужды
Коммуноцентрист1 (2009-03-23 10:25:00) [5]
> Anatoly Podgoretsky © (23.03.09 09:11) [4]
не учи плохому
Anatoly Podgoretsky (2009-03-23 09:11:00) [6]> SP (20.03.2009 18:26:00) [0]
Если NULL то заменить на что то или разрешить вставлять NULL
Коммуноцентрист1 (2009-03-20 21:57:00) [7]можно через merge сделать
merge into table1 a
using (select b.field1 from table2 b)
on (b.field2=a.field2)
when matched then update
Кролик Иа-Иа (2009-03-20 21:46:00) [8]
> update table1 a set a.field1=(select b.field1 from table2
> b where b.field2=a.field2)проблема в том, что для отдельных
> записей table1 подзапрос select может выдавать пустой набор
> данных.Посоветуйте, как обойти проблему в данном случае
where exists (select b.field1 from table2 b where b.field2=a.field2)
SP (2009-03-20 18:37:00) [9]Пока получилось сделать таким образом:
UPDATE card s
SET s.form =
(SELECT fr
FROM (SELECT a.code AS code, d.code AS fr
FROM card a, org b, form c, form d
WHERE a.cardyear = 2009
AND a.idorg = b.code
AND d.charcode = CONCAT ('J', SUBSTR (c.charcode, 2, 7))
AND a.form = c.code
AND SUBSTR (c.charcode, 1, 1) = 'F'
AND b.jur = 1) k
WHERE k.code = s.code)
WHERE EXISTS (
SELECT fr
FROM (SELECT a.code AS code, d.code AS fr
FROM card a, org b, form c, form d
WHERE a.cardyear = 2009
AND a.idorg = b.code
AND d.charcode = CONCAT ('J', SUBSTR (c.charcode, 2, 7))
AND a.form = c.code
AND SUBSTR (c.charcode, 1, 1) = 'F'
AND b.jur = 1) k
WHERE k.code = s.code)
но это как-то сильно мутно получается...
нельзя ли попроще?