Заменить оператор Select на оператор обновления - PullRequest
0 голосов
/ 10 января 2020
SELECT A.GRPNO, A.EMPNO, A.DEPNO, A.PENDCD FROM EMPDEP A, EEDPELIG B
WHERE A.GRPNO=B.GRPNO
AND A.EMPNO=B.EMPNO
AND A.DEPNO=B.DEPNO
AND A.GRPNO = 6606 AND A.SPOUSE = 'T'
AND B.ELIGFLAG01 = 'T' AND SNAPTHRUDT ='DEC312999'

Наш оператор выбора успешно извлек необходимую нам информацию, однако мы новы с SQL и изо всех сил пытаемся создать оператор обновления, который заменяет "a.pendcd = 0" на "a. pendcd = 20 "из информации в операторе выбора. Любая помощь приветствуется, спасибо.

Ответы [ 3 ]

0 голосов
/ 10 января 2020

Oracle не поддерживает FROM или JOIN в UPDATE (в большинстве случаев).

Просто используйте EXISTS:

UPDATE EMPDEP ed
    SET  . . .
    WHERE EXISTS (SELECT 1
                  FROM EEDPELIG p
                  WHERE ed.GRPNO = p.GRPNO AND
                        ed.EMPNO= p.EMPNO AND
                        ed.DEPNO= p.DEPNO AND
                        p.ELIGFLAG01 = 'T'
                 )
          ed.GRPNO = 6606 AND
          ed.SPOUSE = 'T' AND
          ed.SNAPTHRUDT ='DEC312999';

Неясно если условие на SNAPTHRUDT находится на внешней таблице или внутренней таблице. Если он находится на p, переместите его в подзапрос.

0 голосов
/ 10 января 2020

Вы можете использовать оператор MERGE следующим образом:

Допустим, EMPDEP таблица имеет первичный ключ EMPDEP_UID.

MERGE INTO EMPDEP TRG
USING
(SELECT A.EMPDEP_UID, A.PENDCD
   FROM EMPDEP A, EEDPELIG B
  WHERE A.GRPNO=B.GRPNO
    AND A.EMPNO=B.EMPNO
    AND A.DEPNO=B.DEPNO
    AND A.GRPNO = 6606 
    AND A.SPOUSE = 'T'
    AND B.ELIGFLAG01 = 'T' 
    AND SNAPTHRUDT ='DEC312999') SRC
ON (TRG.EMPDEP_UID = SRC.EMPDEP_UID)
WHEN MATCHED THEN
UPDATE SET TRG.PENDCD = 0
WHERE TRG.PENCD = 20;

Вместо него можно использовать unique keys primary key для идентификации записей, которые будут обновлены. Но использование primary key безопасно, поскольку unique key может содержать нули, которые могут изменить поведение нашего запроса.

Cheers !!

0 голосов
/ 10 января 2020
update a
a.pendcd=20
FROM EMPDEP A inner join EEDPELIG B
on A.GRPNO=B.GRPNO
AND A.EMPNO=B.EMPNO
AND A.DEPNO=B.DEPNO
AND A.GRPNO = 6606 AND A.SPOUSE = 'T'
AND B.ELIGFLAG01 = 'T' AND SNAPTHRUDT ='DEC312999'
where a.pendcd=0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...