-
Нужно написать запрос типа этого (этот не работает):
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 может выдавать пустой набор данных.
Посоветуйте, как обойти проблему в данном случае.
-
Пока получилось сделать таким образом:
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)
но это как-то сильно мутно получается... нельзя ли попроще?
-
> 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)
-
можно через merge сделать merge into table1 a using (select b.field1 from table2 b) on (b.field2=a.field2) when matched then update
-
> SP (20.03.2009 18:26:00) [0]
Если NULL то заменить на что то или разрешить вставлять NULL
-
> Anatoly Podgoretsky © (23.03.09 09:11) [4]
не учи плохому
-
>SP (20.03.09 18:26) используйте nvl
>Коммуноцентрист1 (20.03.09 21:57) [3] это Вы учите плохому) в использовании merge, в данном случае, нет никакой нужды
-
> Кщд (26.03.09 10:52) [6]
некуда тут nvl запихать
-
>Коммуноцентрист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)
-
> Кщд (27.03.09 08:41) [8]
Хм. как-то не подумал раньше про это...
|