回答

收藏

您是否遇到过SQL Server由于引用过多表而无法执行的查询?

技术问答 技术问答 200 人阅读 | 0 人回复 | 2023-09-13

您是否看到过任何错误消息?
2 w% T& H6 }5 _-SQL Server 2000
) a7 d; p, w0 I: ^7 r无法为视图或功能解析分配辅助表。
$ Q( Q  D) K+ q# W. F  b超过了查询中的最大表数(256)。/ {# B+ R. I: y  s
-SQL Server 2005
' v% a+ s/ g; N, a% o8 F: b' ^+ |; {7 a0 U: @8 U0 C
查询中的表名太多。允许的最大值为256。' q: t& }: d- ]4 \) ^+ m% Y  F

+ K: M7 Q2 G+ W0 w$ z1 d, v如果是,您做了什么?: e0 R9 n, R! }! R0 ]
放弃了?说服客户简化需求?对数据库进行非规范化?
7 |' W  P' o  [) e: o3 a5 @; r@(每个人都希望我发布查询):
1 N0 ]$ N. \' _; x[ol]我不确定是否可以在答案编辑窗口中粘贴70 KB的代码。; }8 ^) V- P% X( `& F9 C$ }
即使我可以这样做,也无济于事,因为这70 KB的代码将引用20或30个视图,而我也不得不发布这些视图,因为否则该代码将毫无意义。
+ B/ {. L5 |! g# V我不想听起来好像在吹牛,但问题不在查询中。查询是最佳的(或至少几乎是最佳的)。我花了无数小时来优化它们,寻找可以删除的每一个列和每个表。设想一个报表有200或300列,
+ [' x. i/ C1 Q7 a! `8 D1 d[/ol]0 x( R8 K" f' q! m- s) {( y/ k' ]/ D6 q
               
3 H7 W5 q/ T3 }  |) p解决方案:
0 s6 n3 W4 `! i9 G0 V                5 L# n0 d# N6 Y* c/ D# Z" b' a

# x+ q" F" V' Y; w2 S
! }5 n: ]3 F5 A                对于SQL Server 2005,我建议您使用表变量并随需而建部分数据。
8 b3 j& n% Y9 ]  N* Y6 @为此,请创建一个表变量,该变量代表要发送给用户的最终结果集。) G5 f/ O. Z: j: M% ?! B+ L
然后找到您的主表(例如上面示例中的orders表)并提取该数据,以及一些补充数据,这些补充数据仅说一个联接即可(客户名称,产品名称)。您可以执行SELECT INTO将其直接放入表变量中。
9 I9 b% x4 H% b1 Q' D. R从那里开始,遍历表,并针对每一行,执行一堆小的SELECT查询,以检索结果集所需的所有补充数据。将它们插入到每一列中。: m! Y1 v. _+ G# H& {& R
完成后,您可以从表变量中执行简单的SELECT *,并将此结果集返回给用户。6 E8 u, u1 [  z) \/ H! J: @
我对此没有任何确切的数字,但是到目前为止,我已经研究了三个不同的实例,这些实例实际上比使用大量联接执行大型选择查询要快。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则