您是否遇到过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: @
我对此没有任何确切的数字,但是到目前为止,我已经研究了三个不同的实例,这些实例实际上比使用大量联接执行大型选择查询要快。 |
|
|
|
|
|