我有2个表Table 1
和Table 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;
答案 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;