Обновить запрос Обновление всех записей - обновлять только выбранные записи - PullRequest
0 голосов
/ 28 ноября 2018

ОБНОВЛЕНИЕ: я использую запрос из ответа ниже.При выполнении этого запроса он очищает поле SERVICE_DATE_OUT, если не находит соответствия с условиями where.Есть ли способ обойти это?

UPDATE PMEQMT P
       SET SERVICE_DATE_OUT = (SELECT MAX(TL.TRANS_DATE)
                        FROM TRANSLOG TL
                        WHERE P.EQNO = TL.ITEMNO AND 
                              TL.LOC_DESC = 'E-OUT OF SERVICE' AND
                              TL.TRANS_DATE >= SYSDATE - 1
                       )
WHERE P.CLASS = 'TL'

Что я пытаюсь сделать, это то, что, когда ITEMNO на таблице TRANSLOG находится в расположении E-OUT OF SERVICE / E-IN SERVICEи соответствует PMEQMT.EQNO, затем обновите SERVICE_DATE_OUT / IN для этого соответствующего PMEQMT.EQNO.

Запросы обновляют SERVICE_DATE_OUT / IN для всех записей в таблице PMEQMT.Может ли кто-нибудь помочь мне изменить мои запросы, чтобы обновить только соответствующий PMEQMT.EQNO до TRANSLOG.ITEMNO?

UPDATE  PMEQMT
SET     SERVICE_DATE_OUT = (SELECT B.TRANS_DATE
                       FROM TRANSLOG B, PMEQMT A
                       WHERE A.EQNO = B.ITEMNO AND
                       A.CLASS = 'TL' AND
                       B.LOC_DESC = 'E-OUT OF SERVICE' AND
                       B.TRANS_DATE >= SYSDATE - 1)

UPDATE  PMEQMT
SET     SERVICE_DATE_IN = (SELECT B.TRANS_DATE
                       FROM TRANSLOG B, PMEQMT A
                       WHERE A.EQNO = B.ITEMNO AND
                       A.CLASS = 'TL' AND
                       B.LOC_DESC = 'E-IN SERVICE' AND
                       B.TRANS_DATE >= SYSDATE - 1)

1 Ответ

0 голосов
/ 28 ноября 2018

Я думаю, что вы просто хотите коррелированный подзапрос:

UPDATE PMEQMT p
    SET SERVICE_DATE_OUT = (SELECT tl.TRANS_DATE
                            FROM TRANSLOG tl
                            WHERE p.EQNO = tl.ITEMNO AND
                                  p.CLASS = 'TL' AND
                                  tl.LOC_DESC = 'E-OUT OF SERVICE' AND
                                  tl.TRANS_DATE >= SYSDATE - 1
                           );

Я не думаю, что логика совершенно правильная - подзапрос фильтрует внешнюю таблицу и может вернуть более одной строки.Если бы я размышлял, это ближе к тому, что вы хотите:

UPDATE PMEQMT p
    SET SERVICE_DATE_OUT = (SELECT MIN(tl.TRANS_DATE)
                            FROM TRANSLOG tl
                            WHERE p.EQNO = tl.ITEMNO 
                                  tl.LOC_DESC = 'E-OUT OF SERVICE' AND
                                  tl.TRANS_DATE >= SYSDATE - 1
                           )
    WHERE p.CLASS = 'TL';
...