Oracle UPDATE обновляет больше строк, чем SELECT? - PullRequest
0 голосов
/ 28 апреля 2018

У меня есть этот запрос, чтобы перечислить номер заказа, адрес электронной почты в заказе и адрес счета в основных данных. По сути, идея заключается в том, что мне необходимо обновить любые заказы, не выставленные в счет-фактуре, и реплицировать адрес счета-фактуры в заказе с адресом счета-фактуры в основных данных (поскольку он был изменен с момента создания заказа и т. Д.).

Я написал этот SELECT, в котором перечислены ожидаемые результаты, около 25 заказов или около того. Я проверил каждый вручную, и это данные, которые необходимо обновить.

  select auf_adr.auf_nr, auf_adr.email, kust_adr.ku_email
     from auf_adr,auf_kopf,
          kust_adr
     where auf_adr.auf_nr = auf_kopf.auf_nr
       and auf_kopf.kunr = kust_adr.ku_nr
       and auf_adr.adr_art = 2
       and kust_adr.ku_adr_art = 1
       and auf_adr.email != kust_adr.ku_email
       and
         (select sum(auf_stat.rg_anz)
          from auf_stat
          where auf_stat.auf_nr = auf_kopf.auf_nr) = 0;

Так здорово, я преобразовал его в ОБНОВЛЕНИЕ, но оно обновляет 2487385 строк! Что я делаю не так?

update auf_adr
  set email =
    (select kust_adr.ku_email
     from auf_kopf,
          kust_adr
     where auf_adr.auf_nr = auf_kopf.auf_nr
       and auf_kopf.kunr = kust_adr.ku_nr
       and auf_adr.adr_art = 2
       and kust_adr.ku_adr_art = 1
       and auf_adr.email != kust_adr.ku_email
       and
         (select sum(auf_stat.rg_anz)
          from auf_stat
          where auf_stat.auf_nr = auf_kopf.auf_nr) = 0);

Ответы [ 3 ]

0 голосов
/ 28 апреля 2018

если я обновлю выбор в оракуле я буду использовать

update (
   select * from yourtable 
) set "yourcol" = 'yourvalue'

пример:

CREATE TABLE TestTable
    ("col" int, "col2" int, "col3" int)
;

INSERT ALL 
    INTO TestTable ("col", "col2", "col3")
         VALUES (1, 2, 3)
    INTO TestTable ("col", "col2", "col3")
         VALUES (2, 3, 4)
    INTO TestTable ("col", "col2", "col3")
         VALUES (3, 4, 5)
    INTO TestTable ("col", "col2", "col3")
         VALUES (4, 5, 6)
    INTO TestTable ("col", "col2", "col3")
         VALUES (5, 6, 7)
    INTO TestTable ("col", "col2", "col3")
         VALUES (6, 7, 8)
    INTO TestTable ("col", "col2", "col3")
         VALUES (7, 8, 9)
    INTO TestTable ("col", "col2", "col3")
         VALUES (8, 9, 10)
    INTO TestTable ("col", "col2", "col3")
         VALUES (9, 10, 11)
    INTO TestTable ("col", "col2", "col3")
         VALUES (10, 11, 12)
    INTO TestTable ("col", "col2", "col3")
         VALUES (11, 12, 13)
    INTO TestTable ("col", "col2", "col3")
         VALUES (12, 13, 14)
    INTO TestTable ("col", "col2", "col3")
         VALUES (13, 14, 15)
SELECT * FROM dual
;

--Update Data
update (
  select * from TestTable
) set "col" = "col2" * 3;

select * from TestTable;


Ссылка на скрипту SQL: http://sqlfiddle.com/#!4/82c54/3/1

0 голосов
/ 29 апреля 2018

Это потому, что в вашем запросе на обновление нет условия where.

Синтаксис вашего запроса:

UPDATE tablename
SET email = (some query);

Это обновит все записи в таблице

0 голосов
/ 28 апреля 2018

Предположительно, вы намереваетесь что-то вроде этого:

update auf_adr
  set email = (select k.ku_email
               from auf_kopf k join
                    kust_adr ka
                    on k.kunr = ka.ku_nr
               where auf_adr.auf_nr = k.auf_nr
                     ka.ku_adr_art = 1 and
                     auf_adr.email <> ka.ku_email and
                     (select sum(s.rg_anz)
                      from auf_stat s
                      where s.auf_nr = k.auf_nr
                     ) = 0
              )
    where auf_adr.adr_art = 2 and
          exists (select 1
                  from auf_kopf k join
                       kust_adr ka
                       on k.kunr = ka.ku_nr
                  where auf_adr.auf_nr = k.auf_nr
                        ka.ku_adr_art = 1 and
                        auf_adr.email <> ka.ku_email and
                        (select sum(s.rg_anz)
                         from auf_stat s
                         where s.auf_nr = k.auf_nr
                        ) = 0
                  );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...