PLSQL程序比较两个表以查看不同日期的差异

时间:2015-03-19 14:44:34

标签: sql oracle plsql compare procedure

我有两个不同公司提供的数据表。我的主要目标是比较这两个表以检查是否存在任何差异(理想情况下所有数据应该相同)。

所以我的第一个表格格式如下:(只是示例)

companycode     ||  BOOK    ||    DATE                  ||  Amount  ||   
--------------------------------------------------------------------- 
 abcd           || DTCA     ||   06/02/2015 12:00:00 AM || 23679000     
 abcd           || DTCA     ||   09/02/2015 12:00:00 AM || 23679000     
 abcd           || DTCA     ||   10/02/2015 12:00:00 AM || 23679000     
 abcd           || DTCA     ||   11/02/2015 12:00:00 AM || 23679000     
 abcd           || DTCA     ||   12/02/2015 12:00:00 AM || 23679000     
 abcd           || DTCA     ||   13/02/2015 12:00:00 AM || 23679000     
 abcd           || DTCA     ||   16/02/2015 12:00:00 AM || 23679000     
 abcd           || DTCA     ||   17/02/2015 12:00:00 AM || 23679000     

---------------------------------------------------------------------

第一张表看起来像这样你只能看到差异是日期。每个工作日都要检查金额是否实际发生了变化。

我的第一个查询

select companycode, book, date, Amount from al_ext_impact_recon

第二张表

companycode     ||  BOOK    ||    DATE                  ||  Amount  ||   
--------------------------------------------------------------------- 
 abcd           || DTCA     ||   28/02/2015 12:00:00 AM || 23679000     
 abcd           || DTCA     ||   15/03/2015 12:00:00 AM || 24679000     
 abcd           || DTCA     ||   10/04/2015 12:00:00 AM || 25679000     
 abcd           || DTCA     ||   12/05/2015 12:00:00 AM || 26679000     
 abcd           || DTCA     ||   11/06/2015 12:00:00 AM || 27679000     
 abcd           || DTCA     ||   13/07/2015 12:00:00 AM || 28679000     
 abcd           || DTCA     ||   16/08/2015 12:00:00 AM || 29679000     
 abcd           || DTCA     ||   17/09/2015 12:00:00 AM || 30679000   

----------------------------------------------------------------------

第二张表,另一方面只在金额变化时保留记录。 因此日期不一致。

第二次查询

  SELECT COALESCE (sx.a, ps.b) AS companycode,
         pc.profit_centre_mnemonic AS book,
         ps.intended_sd AS date,
         SUM (ps.projected_position + ps.actual_position) AS amount
    FROM ay ps
         INNER JOIN al_profit_centre pc
            ON ps.profit_centre_id = pc.profit_centre_id
         LEFT OUTER JOIN al_raw_stock_xref sx
            ON     ps.stock_mnemonic = sx.stock_mnemonic
               AND sx.stock_code_type = 'ISIN'
   WHERE ps.position_type IN ('P', 'X')
GROUP BY COALESCE (sx.b, ps.a), pc.profit_centre_mnemonic, ps.intended_sd
ORDER BY 1, 2, 3

基本上我想要的只是检查第二个表的日期来进行比较。并做一些像Intersect这样的事情来看看差异。这样做的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

看看这种方法。首先,我“重新设计”了您的第一个表,因此查询仅返回金额更改的记录。我使用分析LAG函数做到了这一点。现在两个表具有相同的逻辑和结构,您可以在它们上使用MINUS。

select * from onchangetable 
minus
select * from (
select companycode, book, curdate, amount from (
select companycode, book, curdate, amount,lag(amount,1,0) over (order by curdate) as amount_prev  
from alldaytable
) where amount!=amount_prev) ;

可能你需要两种方式做MINUS:onchangetable减去alldaytable,alldaytable数据减去onchangetable。

看看sql小提琴示例 http://sqlfiddle.com/#!4/5db65/1

答案 1 :(得分:0)

如果他们的时间段有一些重叠,那么你的两个示例表会好很多。但是,如果我理解正确,表1每天都有一个条目(周末减少),表2只有在金额变化时才有条目。

如果是这样,这个查询应该使表一看起来像表二:

select  companycode, Book, Min( DATE ) as Date, Amount
from    table1
group by companycode, Book, Amount;

现在使用任意数量的方法进行比较,例如MINUS或外连接在外场中寻找NULL。