Конференция "Базы" » Коррелированный запрос UPDATE
 
  • SP (20.03.09 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 (20.03.09 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)



    но это как-то сильно мутно получается...
    нельзя ли попроще?
  • Кролик Иа-Иа © (20.03.09 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 (20.03.09 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 © (23.03.09 09:11) [4]
    > SP  (20.03.2009 18:26:00)  [0]

    Если NULL то заменить на что то или разрешить вставлять NULL
  • Коммуноцентрист1 (23.03.09 10:25) [5]

    > Anatoly Podgoretsky ©   (23.03.09 09:11) [4]

    не учи плохому
  • Кщд (26.03.09 10:52) [6]
    >SP   (20.03.09 18:26)  
    используйте nvl

    >Коммуноцентрист1   (20.03.09 21:57) [3]
    это Вы учите плохому)
    в использовании merge, в данном случае, нет никакой нужды
  • Коммуноцентрист1 (26.03.09 10:57) [7]

    > Кщд   (26.03.09 10:52) [6]

    некуда тут nvl запихать
  • Кщд (27.03.09 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 (30.03.09 17:29) [9]

    > Кщд   (27.03.09 08:41) [8]


    Хм. как-то не подумал раньше про это...
 
Конференция "Базы" » Коррелированный запрос UPDATE
Есть новые Нет новых   [134477   +40][b:0][p:0.003]