Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.08.27;
Скачать: CL | DM;

Вниз

Коррелированный запрос 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.045 c
2-1271317747
rizhiy87
2010-04-15 11:49
2010.08.27
перекодировка из UTF-8


15-1268472470
Незнайка на Луне
2010-03-13 12:27
2010.08.27
Как организовать своё время)


2-1273505020
HRustBB
2010-05-10 19:23
2010.08.27
Как получить указатель на инкапсулирующий объект


2-1269859107
kulon
2010-03-29 14:38
2010.08.27
Отображение вещественных чисел в компанентах


15-1268326974
Правильный$Вася
2010-03-11 20:02
2010.08.27
D2010 обрела уже стабильность?