Oracle按顺序连接行,其中每个表上的顺序定义不同

时间:2015-02-17 13:56:03

标签: oracle join

我有两张桌子

包含project_id,id和load_date

列的TABLE_A

和TABLE_B,列为project_id,delete_flag和delete_date

其中TABLE_A.load_date是一个新列,我想基于TABLE_B.delete_date为历史数据填充它。基本上,文件已经重复加载到系统中,并且历史上我们没有跟踪它何时被加载。但是,每次重新加载文件时,在TABLE_B中使用delete_date(即软删除)更新其先前版本。以前的版本只是保留在TABLE_A中而没有任何更改。

我想根据TABLE_B中的匹配项目填充TABLE_A.load_date。 TABLE_A中最旧的行(最小的TABLE_A.id)与TABLE_B中最旧的行(最旧的delete_date)等匹配。因此,如果您按顺序从每个表中选择下一行,则行应该匹配。但我不知道如何将其变成Oracle声明。到目前为止我所得到的是没有处理行顺序匹配的内容:

MERGE INTO TABLE_A a 
USING 
(
  SELECT PROJECT_ID, DELETE_DATE
  FROM TABLE_B
  WHERE DELETE_FLAG = 'Y'
  ORDER BY DELETE_DATE ASC
) b ON (a.PROJECT_ID = b.PROJECT_ID)
WHEN MATCHED THEN UPDATE 
    SET a.LOAD_DATE = p.DELETE_DATE;

1 个答案:

答案 0 :(得分:1)

只要我正确理解您的标准,此合并应该可以完成工作:

merge into table_a ta
using (
  select pid project_id, id, delete_date
    from (
      select project_id pid, id, 
          row_number() over (partition by project_id order by id) rn
        from table_a) a
    join (
      select project_id pid, delete_date, 
          row_number() over (partition by project_id order by delete_date ) rn
        from table_b
        where delete_flag='Y') b using (pid, rn) ) tb 
on (ta.project_id = tb.project_id and ta.id = tb.id)
when matched then update
  set ta.load_date = tb.delete_date