【问题标题】:Selecting the first record for each group and updating it using value from another table in Oracle为每个组选择第一条记录并使用 Oracle 中另一个表中的值更新它
【发布时间】:2023-04-11 00:17:02
【问题描述】:

我有 2 张桌子 Table 1Table 2。我必须根据表 2 中的最小 START_DATE 为每个 EMP_ID 选择第一条记录,并使用表 1 中的 CREATION_DATE 对其进行更新。我已尝试使用以下查询。但我收到的错误是 SQL 错误:

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

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

查询:

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;

【问题讨论】:

标签: sql oracle join oracle11g sql-update


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    • 2020-12-28
    • 1970-01-01
    • 1970-01-01
    • 2019-01-26
    • 2014-09-05
    • 2017-05-15
    相关资源
    最近更新 更多