Как обновить значения столбца T1 из T2, используя одно условие? - PullRequest
0 голосов
/ 16 октября 2019

Я пробовал этот запрос, и я получаю сообщение об ошибке SQL: ORA-00933: команда SQL не завершена должным образом, но я не вижу, в чем проблема на самом деле?

update T1 set T1.name=T2.name from Table1 T1
inner join Table2 T2
on T1.id=T2.id where T2.id in (select id from Table2   group by  id having  count(entity)=1);

Ответы [ 3 ]

4 голосов
/ 17 октября 2019

Ваш оператор недопустим в синтаксисе Oracle.

У вас есть два общих варианта.

Опция # 1: используйте коррелированный подзапрос в вашем UPDATE ...

update table t1
set    t1.name = ( SELECT t2.name
                   FROM   table2 t2
                   WHERE  t2.id = t1.id 
                   AND    t2.id IN ( SELECT t2a.id 
                                     FROM table2 t2a 
                                     GROUP BY t2a.id 
                                     HAVING COUNT(t2a.entity) = 1 )
                 ) 
where exists ( SELECT 'x'
               FROM   table2 t2
               WHERE  t2.id = t1.id 
               AND    t2.id IN ( SELECT t2a.id 
                                 FROM table2 t2a 
                                 GROUP BY t2a.id 
                                 HAVING COUNT(t2a.entity) = 1 )

;

Вариант № 2: (мое предпочтение) использовать оператор MERGE:

merge into table1 t
using  ( SELECT t2.id, 
                t2.name,
                COUNT(t2.entity) OVER ( PARTITION BY t2.id ) entity_count
         FROM   table2 t2
       ) u
ON ( t.id = u.id AND u.entity_count = 1 )
WHEN MATCHED THEN UPDATE SET t.name = u.name;

Обычно я тестирую SQL перед публикацией, но сегодня нет времени. Таким образом, в приведенном выше тексте могут быть синтаксические ошибки.

0 голосов
/ 17 октября 2019

Я не уверен, понял ли я контекст данных. Я создал пример, в котором идентификаторы не являются УНИКАЛЬНЫМИ

create table T1 ( name varchar2(55), id number(4,0), entity number(2,0));
create table T2 ( name varchar2(55), id number(4,0), entity number(2,0));

insert into T1 (name, id, entity) values ('T1name1', 1, 1);
insert into T1 (name, id, entity) values ('T1name2', 2, 1);
insert into T1 (name, id, entity) values ('T1name3', 3, 3);
insert into T1 (name, id, entity) values ('T1name4', 4, 4);

insert into T2 (name, id, entity) values ('T2name1', 1, 1);
insert into T2 (name, id, entity) values ('T2name2', 2, 1);
insert into T2 (name, id, entity) values ('T2name3', 3, 3);
insert into T2 (name, id, entity) values ('T2name4', 3, 1);

update T1 set name =
                    nvl(
                        ( select name
                          from T2
                          where T2.id = T1.id 
                            and exists 
                                ( select 'x'  
                                  from T2 table2 
                                  where table2.id = T2.id
                                  group by id 
                                  having count(entity) = 1)
                         )
                    ,T1.name)

. В этом контексте будут обновлены только T1.id = 1 и T1.id = 2 (T2.id = 3 имеет количество (сущность) =2)

0 голосов
/ 17 октября 2019

Я бы сказал update как:

update table t1
    set t1.name = (select t2.name
                   from table2 t2
                   where t2.id = t1.id and rownum = 1
                  )
    where (select count(t2.entity)
           from table2 t2
           where t2.id = t1.id
          ) = 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...