Oracle обновление с левым соединением - PullRequest
3 голосов
/ 06 марта 2020

Я хочу просто обновить один набор таблиц строк с параметрами, переданными, а не из другой таблицы, но чтобы определить строки, мне нужно выполнить левое соединение. Вот запрос на выбор:

SELECT *
FROM SAMPLE_STATUS pss
  LEFT JOIN QC q ON q.SAMPLE_ID = pss.SAMPLE_ID
WHERE q.CONTRACT_CLN_ID = 28 AND q.LOT = 1

Я пробовал несколько примеров, вот последний, с одним столбцом

UPDATE 
  (SELECT pss.APP_WIN_START_DT, TO_CHAR(sysdate, 'YYYYMMDD') AS NEW_AWSD
  FROM SAMPLE_STATUS pss
    LEFT JOIN QC q ON q.SAMPLE_ID = pss.SAMPLE_ID
  WHERE q.CONTRACT_CLN_ID = 28 AND q.LOT = 1) pq
  SET APP_WIN_START_DT = NEW_AWSD

Несколько записей извлекаются из таблицы Q C которые присоединяются к таблице Sample_Status через идентификатор образца. Я получаю ошибку:

SQL Error: ORA-01779: cannot modify a column which maps to a non key-preserved table
01779. 00000 -  "cannot modify a column which maps to a non key-preserved table"
*Cause:    An attempt was made to insert or update columns of a join view which
           map to a non-key-preserved table.
*Action:   Modify the underlying base tables directly.

Заранее спасибо.

1 Ответ

1 голос
/ 06 марта 2020

Я думаю, что вы на самом деле хотите здесь использовать внутреннюю логику соединения c, но в любом случае вы можете написать это обновление, используя следующую команду:

UPDATE SAMPLE_STATUS pss
SET APP_WIN_START_DT = TO_CHAR(sysdate, 'YYYYMMDD')
WHERE EXISTS (SELECT 1 FROM QC q
              WHERE q.SAMPLE_ID = pss.SAMPLE_ID AND
                    q.CONTRACT_CLN_ID = 28 AND q.LOT = 1);

Причина, по которой я подозреваю, что вы не хотите левого соединения здесь вы обновляете поле таблицы в левой части объединения. Но поскольку у вас есть ограничения в предложении where в правой части таблицы, в любом случае он будет вести себя как внутреннее соединение.

...