Выбор первой записи для каждой группы и ее обновление с использованием значения из другой таблицы в Oracle - PullRequest
0 голосов
/ 28 августа 2018

У меня есть 2 таблицы Table 1 & Table 2. Я должен выбрать первую запись для каждого EMP_ID на основе минимального START_DATE из таблицы 2 и обновить его с помощью CREATION_DATE из ТАБЛИЦЫ 1. Я пытался выполнить запрос ниже. Но я получаю ошибку как ошибка SQL:

ORA-00904: "IP". "CREATION_DATE": неверный идентификатор 00904. 00000 - «% s: неверный идентификатор» * Причина: * Действие:

Я не уверен, как это сделать, поскольку я новичок в Oracle. Любые предложения будут ценными. Пример скриншота для справки.

screenshot

QUERY:

UPDATE 
    (SELECT PSH.EMP_ID,PSH.START_DATE,EM.CREATION_DATE FROM EMP_MAIN EM 
 INNER JOIN 
    (SELECT EMP_ID,START_DATE FROM (SELECT EMP_ID,START_DATE,
    ROW_NUMBER() OVER (PARTITION BY EMP_ID ORDER BY EMP_ID, START_DATE) 
    AS RN   FROM EMP_STATUS) WHERE RN=1) ES 
ON ES.EMP_ID = EM.PROJECT_ID) 
SET EM.START_DATE = ES.CREATION_DATE;

1 Ответ

0 голосов
/ 28 августа 2018

Я считаю, что с помощью оператора MERGE такого рода вещи намного проще, чем с оператором UPDATE. Причина в том, что вы можете написать запрос к SELECT строкам так, как вы хотите, чтобы они смотрели после операции, а затем использовать этот SELECT в качестве источника строки для вашего MERGE, чтобы это произошло.

Я не потрудился создать структуру вашей таблицы в моей базе данных (CREATE TABLE DDL с INSERTs было бы неплохо при публикации вопроса), поэтому здесь могут быть опечатки / синтаксические ошибки, но это должно сработать:

MERGE INTO table2 t2
USING ( 
SELECT * FROM (
SELECT  t2.rowid t2_row_id,
        row_number() over ( partition by t1.emp_id
                            order by t2.start_date ) rn,
        t1.creation_date new_start_date
FROM    table1 t1 
INNER JOIN table2 t2 ON t2.emp_id = t1.emp_id
) WHERE rn = 1
) u
ON ( t2.rowid = u.t2_row_id )
WHEN MATCHED THEN UPDATE SET t2.start_date = u.new_start_date;
...