当Table2中的差异与if else条件时,如何插入/追加到Table1中

时间:2015-10-13 19:00:12

标签: mysql oracle algorithm plsql create-table

要求:

我们有月度运行流程,我们在其中创建Table1Table2

1。如果我们在1月份运行了我们的流程,就会创建Table2。自从Jan首次运行以来,我们之前没有创建Table1。因此,系统应该将Table2中的所有内容放入Table1

2。现在让我们说如果我们在2月份运行我们的流程它会创建Table2。我们的系统应检查Table1是否存在。如果是,则(t2.Run_dt > t1.Insert_dt)然后从Table2中选择Table1中不存在的所有ID,并将这些记录插入/追加到Table1

3。现在让我们说,如果我们再次在2月重新运行我们的流程,它会创建Table2。如果是,我们的系统应检查Table1是否存在,(t2.Run_dt = t1.Insert_dt)然后从Table2中选择Table1中不存在的所有ID,并将这些记录插入/追加到Table1

4. 等等......

我有这两张桌子;

Table1

 ID    Price   Insert_Dt
----- ------- -------------
 345   24.35   01-APR-2015

Table2

 ID    Price   Run_Date
----- ------- -------------
 345   24.35   01-MAY-2015
 678   15.35   01-MAY-2015

我想在下面给出的逻辑上编写一个更新table1的查询。

  1. 如果Table1.Run_date >= Table2.Insert_Dt
    Table2 - Table1 = records found

    然后将新记录插入Table1

  2. 如果Table1.Run_date >= Table2.Insert_Dt
    Table2-Table1 = no records found
    然后什么都不做

  3. 否则不做任何事

  4. DECLARE
      nCount NUMBER;
      mCount NUMBER;
    BEGIN
    
      select count(*) into nCount from dba_tables where table_name = Table1;
    
      if ( (nCount>0)
           and ( (select max(a.Run_Date) from Table1 a)
                    > (select max(b.Insert_Date) from Table2 b) )  )
      then
        create table difference as
        select * from Table2 c where c.ID not in(select d.ID  from Table2 d)
    
        select count(*) into mCount
          from dba_tables
         where table_name = 'difference';
    
        if (nCount > 0) then insert /*+ append */ into Table1
          select ID,Price,Run_Date
            from (select ID,Price,Insert_Date from difference);
        end
    END;
    

1 个答案:

答案 0 :(得分:0)

我认为这就是你所描述的,但我有几个问题:

class Application
{
    private Process _process; 

    private static string _applicationPath = string.Empty;

    public void Start(string arguments)
    {
        if (!File.Exists(_applicationPath))
            Deploy();
        _process = Process.Start(_applicationPath, arguments);
    }

    public void SomeMethod()
    {
        //method that manipulate _process
    }

    private void Deploy()
    {
        // copying, installation steps (takes some time) and assign _applicationPath
    }
}
  1. 您确定要insert into table1 with max_run as ( select id, max (insert_dt) as max_date from table1 group by id ) select t2.id, t2.price, t2.run_date from table2 t2, max_run t1 where t2.id = t1.id (+) and -- (t1.id is null or t2.run_date >= t1.max_date) changed below, per edit (t1.id is null or t2.run_date > t1.max_date) 而不是>= insert_dt吗?拥有> insert_dt意味着我们会一遍又一遍地插入这些记录,即使它们不是新的
  2. 您是否要插入新记录或使用新信息更新现有记录?您的查询说您想要插入它们,我在您的代码段中没有看到任何更新代码,所以我保持原样