选择每个组的第一条记录,并使用Oracle中另一个表中的值对其进行更新

时间:2018-08-28 12:44:18

标签: sql oracle join oracle11g sql-update

我有2个表Table 1Table 2。我必须根据表2中的分钟START_DATE为每个EMP_ID选择第一条记录,并使用表1中的CREATION_DATE更新它。我尝试使用以下查询。但是我得到的错误是SQL错误:

  

ORA-00904:“ IP”。“ CREATION_DATE”:无效的标识符00904。   00000-“%s:无效的标识符” *原因:*操作:

由于我是Oracle新手,所以我不确定如何完成此操作。任何建议都是有价值的。屏幕截图示例供参考。

screenshot

查询:

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 :(得分:2)

我发现使用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;