我在优化一个查询,但是原来的这个查询非常复杂,基本结构是这样的(不知道能不能描述清楚)select  distinct 若干列   from 视图A left  join  视图B on a.VendorNO=b.VendorNO";而视图A是这样的:select  若干列  from 视图A_1 
left join  表a on 连接条件
left join 表b  on 连接条件 
left join 表c  连接条件
inner join (select 若干列  from 视图A_1
left join  表a on 连接条件) e
on 连接条件视图B:select 若干列 from (select 若干列  from 视图A group by   VendorNO ) a 
left join (若干列 from  视图A left join 视图A_1_1 on 连接条件 where  筛选条件 group by **) b on  连接条件
left join (select 若干列 from 表d group by ** ) c on 连接条件视图A_1是由A_1_1和其他视图构成的。现在的问题是,我把视图A_1和视图B建了临时表来保存每次的结果,然后视图A改为从临时表中取数据而不是从视图。并且中间的结果都对,为什么最后确比原来的查询方式少记录数。请问应该从哪个方面入手来确定原因?谢谢

解决方案 »

  1.   

    我比较了临时表和相对应的视图的记录条数,二者是一样的。我在前台循环了某一列的所有记录并加总,得出的结果确不一样,并且导出到excel中比较确实少记录。是否有可能连接有NULL值的时候会有问题呢?但是只有在插入临时表的语句过后会有“聚合或SET操作取消了空值”,但是临时表和相对应的视图的记录条数是一样的。
      

  2.   

    我又仔细查了一下,找到了问题的所在。看来是以前我弄错了。
    但是为什么我 insert into 临时表 select * from 视图
    后,视图和临时表的结果不一样呢?表和视图的结构是完全一样的。说聚合或set操作取消了空值,应该怎么才能把视图中的内容完全一样的复制到临时表里呢?
      

  3.   

    视图说白了就是个查询的结果集.而临时表则是存放了数据的表.在你利用视图生成了临时表之后, 临时表中数据不会变.而视图所依具的表的数据发生变化后,视图中的数据也跟着变, 所以临时表中数据与视图就有区别了.另外,由于不同的语句中可能使用了 order by 或 top 之类的查询, 或是用了连接, sql在执行查询时,自己优化每次所选的排序依具不一定相同,也会造成了数据结果的差异.