通过临时表解决--未能为视图或函数解释分析分配辅助表,超过了查询中表地最大数目(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
利用临时标替代后,查询一次临时表,相当于一个表结构,而不像视图的多个表,就会把整个表的连接数减下来。
这几天通过视图创建了一个复杂的多表查询,但在执行查询事后总是报(未能为视图或函数解释分析分配辅助表,超过了查询中表地最大数目(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
利用临时标替代后,查询一次临时表,相当于一个表结构,而不像视图的多个表,就会把整个表的连接数减下来。
相关文章推荐
- 通过代码解决SharePoint列表视图权限分配问题
- 通过代码解决SharePoint列表视图权限分配问题【转】
- 一个关于时间的故事(通过历史分析解决程序问题)
- 解决终端服务器超过了最大允许连接的问题
- oracle 临时表 解决 "表 *** 发生了变化,触发器/函数不能读"的问题
- 【包含的前缀数目超过了最大值。最大值为 2】 解决办法
- 运用ORACLE的OO4O类库函数解决调用存储过程向远程数据库上传超过32K图片失败的问题
- 直接通过SQL能查到,通过HSQL查询不到问题解决
- ORA-01000: 超出打开游标的最大数 问题的分析和解决
- 在开发环境中常遇到更改存储过程、函数、视图等对象,解决SQL Server2005里sp_helptext输出格式错行问题
- oracle 临时表 解决 "表 *** 发生了变化,触发器/函数不能读"的问题
- DotNetNuke(DNN)皮肤制作-通过JS文件解决不同IE版本对CSS解释不一致的问题
- 关于hibernate查询视图时,相同主键的两条记录映射问题【已解决】
- ORA-01000: 超出打开游标的最大数 问题的分析和解决
- 重置mysql Root用户密码及修改默认字符集一般就算设置了表的默认字符集为utf8并且通过UTF-8编码发送查询,你会发现存入数据库的仍然是乱码。问题就出在这个connection连接层上。 解决
- 通过整合多种Oracle技术来定位、分析并解决问题——一次Access数据库表导入Oracle的完整记录
- 关于MYSQL通过子查询删除重复数据的for update报错问题解决
- Asp.net上传出现“超过了最大请求长度”的问题解决方法
- 使用TraceMon分析TimesTen查询最大连续内存块瞬间Hang问题[TimesTen运维]
- 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了;面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为(转)