您的位置:首页 > 其它

通过临时表解决--未能为视图或函数解释分析分配辅助表,超过了查询中表地最大数目(260)--的问题

2009-04-16 15:36 453 查看
问题起因:

     这几天通过视图创建了一个复杂的多表查询,但在执行查询事后总是报(未能为视图或函数解释分析分配辅助表,超过了查询中表地最大数目(260)--)这个异常。

  我的查询SQL脚本如下:

select T1.当前处理人帐号,T1.当前处理人姓名,T1.当前处理人岗位,T1.当前处理人部门,T1.未关闭问题数,
(case when T2.待处理 is null then 0 else T2.待处理 end) as
待处理,(case when T3.需求处理中 is null then 0 else T3.需求处理中 end) as
 需求处理中,(case when T4.修改中 is null then 0 else T4.修改中 end) as 修改中,
(case when T5.待验证 is null then 0 else T5.待验证 end) as 待验证,(case when T7.替换文件待验证
is null then 0 else T7.替换文件待验证 end) as 替换文件待验证,(case when T6.待构造
 is null then 0 else T6.待构造 end) as 待构造  from(
(select 当前处理人帐号,当前处理人姓名,当前处理人岗位,当前处理人部门,count(id) as 未关闭问题数
 from V_ZCW_CurrentDeptAndProduct_CurrUser 
where state <>'已关闭'  AND (当前处理人岗位
  in ('开发','测试','设计','管理','需求','产品管理','开发管理','支持','实施','市场')) group by 
当前处理人帐号,当前处理人姓名,当前处理人岗位,当前处理人部门 ) T1 left outer join
 (select 当前处理人帐号,count(id) as 待处理 from V_ZCW_CurrentDeptAndProduct_CurrUser 
 where state ='待处理'  AND (当前处理人岗位
 in ('开发','测试','设计','管理','需求','产品管理','开发管理','支持','实施','市场'))
 group by  当前处理人帐号 ) T2 on T1.当前处理人帐号=T2.当前处理人帐号
 left outer join  (select 当前处理人帐号,count(id) as 需求处理中 from V_ZCW_CurrentDeptAndProduct_CurrUser
  where state ='需求处理中'  AND (当前处理人岗位  in
('开发','测试','设计','管理','需求','产品管理','开发管理','支持','实施','市场')) group by
 当前处理人帐号 ) T3 on T1.当前处理人帐号=T3.当前处理人帐号 left outer join
 (select 当前处理人帐号,count(id) as 修改中 from V_ZCW_CurrentDeptAndProduct_CurrUser  where state ='修改中'
  AND (当前处理人岗位  in ('开发','测试','设计','管理','需求','产品管理','开发管理','支持','实施','市场'))
group by  当前处理人帐号 ) T4 on T1.当前处理人帐号=T4.当前处理人帐号
 left outer join  (select 当前处理人帐号,count(id) as 待验证 from V_ZCW_CurrentDeptAndProduct_CurrUser 
 where state ='待验证'  AND (当前处理人岗位  in
 ('开发','测试','设计','管理','需求','产品管理','开发管理','支持','实施','市场'))
group by  当前处理人帐号 ) T5 on T1.当前处理人帐号=T5.当前处理人帐号  left outer join
 (select 当前处理人帐号,count(id) as 待构造 from V_ZCW_CurrentDeptAndProduct_CurrUser  where state ='待构造'
  AND (当前处理人岗位  in ('开发','测试','设计','管理','需求','产品管理','开发管理','支持','实施','市场'))
 group by  当前处理人帐号 ) T6 on T1.当前处理人帐号=T6.当前处理人帐号 
left outer join  (select 当前处理人帐号,count(id) as 替换文件待验证
from V_ZCW_CurrentDeptAndProduct_CurrUser  where state ='替换文件待验证'  AND (当前处理人岗位
 in ('开发','测试','设计','管理','需求','产品管理','开发管理','支持','实施','市场'))
 group by  当前处理人帐号 ) T7 on T1.当前处理人帐号=T7.当前处理人帐号) where T1.当前处理人帐号 is not null
 order by T1.未关闭问题数  desc
select 当前处理人帐号,count(id) as 待处理 from V_ZCW_CurrentDeptAndProduct_CurrUser 
 where (当前处理人岗位
 in ('开发','测试','设计','管理','需求','产品管理','开发管理','支持','实施','市场'))
 group by  当前处理人帐号

 

 

解决办法:

  利用临时表,将查询的视图变成临时表,更新后的脚本如下:蓝色是新加的内容。

create table #TempTable
(
   id char(20),
   版本  varchar(50), 部门 varchar(50), state varchar(50),产品 varchar(50), 计划完成时间 datetime, 关闭时间 datetime,
   提交时间 datetime, 确认后问题类型 varchar(50), 需求处理人 varchar(50), 开发处理人 varchar(50),
   问题验证人 varchar(50), 客户名称 varchar(50), 处理工作量 int, 当前处理人姓名 varchar(50),
   当前处理人帐号 varchar(50), 当前处理人电话 varchar(50),
   当前处理人岗位 varchar(50), 当前处理人部门 varchar(50)
)

insert into #TempTable
SELECT     id,版本, 部门,产品, state, 计划完成时间, 关闭时间, 提交时间, 确认后问题类型, 需求处理人, 开发处理人, 问题验证人, 客户名称, 处理工作量, 当前处理人姓名,
                      当前处理人帐号, 当前处理人电话, 当前处理人岗位, 当前处理人部门
FROM         cqmaster.V_ZCW_CurrentDeptAndProduct_CurrUser

select T1.当前处理人帐号,T1.当前处理人姓名,T1.当前处理人岗位,T1.当前处理人部门,T1.未关闭问题数,
(case when T2.待处理 is null then 0 else T2.待处理 end) as
待处理,(case when T3.需求处理中 is null then 0 else T3.需求处理中 end) as
 需求处理中,(case when T4.修改中 is null then 0 else T4.修改中 end) as 修改中,
(case when T5.待验证 is null then 0 else T5.待验证 end) as 待验证,(case when T7.替换文件待验证
is null then 0 else T7.替换文件待验证 end) as 替换文件待验证,(case when T6.待构造
 is null then 0 else T6.待构造 end) as 待构造  from(
(select 当前处理人帐号,当前处理人姓名,当前处理人岗位,当前处理人部门,count(id) as 未关闭问题数
 from #TempTable 
where state <>'已关闭'  AND (当前处理人岗位
  in ('开发','测试','设计','管理','需求','产品管理','开发管理','支持','实施','市场')) group by 
当前处理人帐号,当
4000
前处理人姓名,当前处理人岗位,当前处理人部门 ) T1 left outer join
 (select 当前处理人帐号,count(id) as 待处理 from #TempTable
 where state ='待处理'  AND (当前处理人岗位
 in ('开发','测试','设计','管理','需求','产品管理','开发管理','支持','实施','市场'))
 group by  当前处理人帐号 ) T2 on T1.当前处理人帐号=T2.当前处理人帐号
 left outer join  (select 当前处理人帐号,count(id) as 需求处理中 from #TempTable
  where state ='需求处理中'  AND (当前处理人岗位  in
('开发','测试','设计','管理','需求','产品管理','开发管理','支持','实施','市场')) group by
 当前处理人帐号 ) T3 on T1.当前处理人帐号=T3.当前处理人帐号 left outer join
 (select 当前处理人帐号,count(id) as 修改中 from #TempTable  where state ='修改中'
  AND (当前处理人岗位  in ('开发','测试','设计','管理','需求','产品管理','开发管理','支持','实施','市场'))
group by  当前处理人帐号 ) T4 on T1.当前处理人帐号=T4.当前处理人帐号
 left outer join  (select 当前处理人帐号,count(id) as 待验证 from #TempTable
 where state ='待验证'  AND (当前处理人岗位  in
 ('开发','测试','设计','管理','需求','产品管理','开发管理','支持','实施','市场'))
group by  当前处理人帐号 ) T5 on T1.当前处理人帐号=T5.当前处理人帐号  left outer join
 (select 当前处理人帐号,count(id) as 待构造 from #TempTable  where state ='待构造'
  AND (当前处理人岗位  in ('开发','测试','设计','管理','需求','产品管理','开发管理','支持','实施','市场'))
 group by  当前处理人帐号 ) T6 on T1.当前处理人帐号=T6.当前处理人帐号 
left outer join  (select 当前处理人帐号,count(id) as 替换文件待验证
from #TempTable  where state ='替换文件待验证'  AND (当前处理人岗位
 in ('开发','测试','设计','管理','需求','产品管理','开发管理','支持','实施','市场'))
 group by  当前处理人帐号 ) T7 on T1.当前处理人帐号=T7.当前处理人帐号) where T1.当前处理人帐号 is not null
 order by T1.未关闭问题数  desc
select 当前处理人帐号,count(id) as 待处理 from #TempTable
 where (当前处理人岗位
 in ('开发','测试','设计','管理','需求','产品管理','开发管理','支持','实施','市场'))
 group by  当前处理人帐号

运行结果:

 

  


 

总结: 

   在查询中如果要使用多表连接,如利用视图开发统计报表,那么表的连接表的数目就会很大,在这个问题中,结果中的每一列我都是通过查询视图,在对结果左连接得到的;在我把视图 V_ZCW_CurrentDeptAndProduct_CurrUser

利用临时标替代后,查询一次临时表,相当于一个表结构,而不像视图的多个表,就会把整个表的连接数减下来。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐