在Oracle(PROD)中,我们将创建关于表的视图,用户将查询视图以获取每个报告周期的数据(一个月,例如:在' 01-DEC-之间2015'和' 31-DEC-2015')。我们创建了一个视图
CREATE OR REPLACE VIEW VW_TABLE1 AS SELECT ACCNT_NBR, BIZ_DATE, MAX(COL1) COL1, MAX(COL2) COL2 FROM TABLE1_D WHERE BIZ_DATE IN (SELECT BIZ_DATE FROM TABLE2_M GROUP BY BIZ_DATE) GROUP BY ACCNT_NBR, BIZ_DATE;
这里的问题是TABLE1_D(每日表,有2015年12月至2016年2月的数据)有一个月的多个日期的记录,例如2015年12月,它有01-DEC-2015,02-DEC-2015的记录,...... 。,29-DEC-2015,30-DEC-2015(可能不是连续的,但在工作日加载),每天有近2,500,000条记录。 TABLE2_M是一个月度表,有一个月的单一日期(例如2015年12月2015年12月30日),每个日期有大约4000条记录。
当我们将视图查询为
时SELECT * FROM VW_TABLE1 WHERE BIZ_DATE BETWEEN '01-DEC-2015' AND '31-DEC-2015'
它按预期返回表TABLE1_D中30-DEC-2015的聚合数据。我认为TABLE1_D中BIZ_DATE的分组是不必要的,因为只有一个BIZ_DATE将是INNER查询的输出。
通过删除最终GROUP BY中的BIZ_DATE进行检查,假设内部查询中将存在一天的数据。
因此,两个表格中的30-dec-2015和30-jan-2016日期为2行,并在SIT中创建它们以进行测试并创建视图
CREATE VIEW VW_TABLE1 AS SELECT ACCNT_NBR, MAX(BIZ_DATE) BIZ_DATE, MAX(COL1) COL1, MAX(COL2) COL2 FROM TABLE1_D WHERE BIZ_DATE IN (SELECT BIZ_DATE FROM TABLE2_M GROUP BY BIZ_DATE) GROUP BY ACCNT_NBR;
每个月之间的选择(或=确切的月份日期)在SIT中给出正确的数据;即,当BETWEEN使用一个月时,它会产生相应的月份数据。
SELECT * FROM VW_TABLE1 WHERE BIZ_DATE BETWEEN '01-DEC-2015' AND '31-DEC-2015';
SELECT * FROM VW_TABLE1 WHERE BIZ_DATE = '30-DEC-2015';
有了这个,我修改了PROD中的视图DDL(与SIT相同)。但令人惊讶的是同样的选择(第二个= =' 30-DEC-2015'第一个由于数据量太长而因此中止) 没有返回数据;因为我希望内部查询在2015年12月30日到2016年1月30日之间发送日期,因此MAX(BIZ_DATE)将从2016年1月30日开始。 (表2_M没有FEB2016数据)
我验证了SIT和PROD中是否存在Oracle的任何版本差异,并发现它与v $ version(11.2.0.4.0)相同。你能不能把这种行为解释为同一个视图DDL在不同的环境中使用相同的数据返回不同的结果......