Форум: "Базы";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];
ВнизКоррелированный запрос UPDATE Найти похожие ветки
← →
SP (2009-03-20 18:26) [0]Нужно написать запрос типа этого (этот не работает):
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-20 18:37) [1]Пока получилось сделать таким образом:
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)
но это как-то сильно мутно получается...
нельзя ли попроще?
← →
Кролик Иа-Иа © (2009-03-20 21:46) [2]
> 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)
← →
Коммуноцентрист1 (2009-03-20 21:57) [3]можно через merge сделать
merge into table1 a
using (select b.field1 from table2 b)
on (b.field2=a.field2)
when matched then update
← →
Anatoly Podgoretsky © (2009-03-23 09:11) [4]> SP (20.03.2009 18:26:00) [0]
Если NULL то заменить на что то или разрешить вставлять NULL
← →
Коммуноцентрист1 (2009-03-23 10:25) [5]
> Anatoly Podgoretsky © (23.03.09 09:11) [4]
не учи плохому
← →
Кщд (2009-03-26 10:52) [6]>SP (20.03.09 18:26)
используйте nvl
>Коммуноцентрист1 (20.03.09 21:57) [3]
это Вы учите плохому)
в использовании merge, в данном случае, нет никакой нужды
← →
Коммуноцентрист1 (2009-03-26 10:57) [7]
> Кщд (26.03.09 10:52) [6]
некуда тут nvl запихать
← →
Кщд (2009-03-27 08:41) [8]>Коммуноцентрист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)
← →
SP (2009-03-30 17:29) [9]
> Кщд (27.03.09 08:41) [8]
Хм. как-то не подумал раньше про это...
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.061 c