回答

收藏

在自我加入问题上需要一些认真的帮助

技术问答 技术问答 163 人阅读 | 0 人回复 | 2023-09-12

正如你所知,你不能通过自连接为视图编制索引。嗯,事实上,即使是同一张桌子的两个连接,即使不是技术上的自连接。微软的几个人提出了一个解决方案。但太复杂了,我不明白!!!
0 k9 Q& k) w$ i, Z2 M这里有解决问题的办法:http : //jmkehayias.blogspot.com/2008/12/creating-
" ?7 k; ]2 X$ _4 P3 oindexed-view-with-self-
. f  n$ z8 }4 T- {8 I  mjoin.html! n% |+ J/ k5 S; n% Q5 r" D. n
我想应用这项工作的视图是:
+ Q" n" k# p) `" y$ V2 ]! O/ @$ \create VIEW vw_lookup_testWITH SCHEMABINDINGASselectcount_big(*) as [count_all],awc_txt,city_nm,str_nm,stru_no,o.circt_cstdn_nm [owner],t.circt_cstdn_nm [tech],dvc.circt_nm,data_orgtn_yr from ((dbo.dvc join dbo.circt on dvc.circt_nm = circt.circt_nm) join dbo.circt_cstdn oon circt.circt_cstdn_user_id = o.circt_cstdn_user_id)join dbo.circt_cstdn ton dvc.circt_cstdn_user_id = t.circt_cstdn_user_idgroup byawc_txt,city_nm,str_nm,stru_no,o.circt_cstdn_nm,t.circt_cstdn_nm,dvc.circt_nm,data_orgtn_yr go感谢任何帮助!!!+ u. e: O+ Q6 T3 p
非常感谢!
2 Q8 y1 X7 [5 N  P# V) x5 R; @4 V1 ^编辑:所以我发现它也会起作用。请注意,我在第一个索引视图中加入了表,在第二个非索引视图中加入了表。6 \7 l' D6 p& _. ~- d+ K" _
alter VIEW vw_lookup_owner_test2WITH SCHEMABINDING  AS selectcount_big(*) as [countAll],awc_txt,city_nm,str_nm,stru_no,dvc.circt_nm,circt_cstdn_nm,data_orgtn_yr,dvc.circt_cstdn_user_idfrom dbo.dvc join dbo.circton dvc.circt_nm = circt.circt_nmjoin dbo.circt_cstdn oon circt.circt_cstdn_user_id = o.circt_cstdn_user_idgroup byawc_txt,city_nm,str_nm,stru_no,dvc.circt_nm,circt_cstdn_nm,data_orgtn_yr,dvc.circt_cstdn_user_idgo和
  C2 u7 {1 J& T4 YCREATE UNIQUE CLUSTERED INDEX [idx_vw_lookup_owner2_test1] ON [dbo].[vw_lookup_owner_test     [awc_txt] ASC,   [city_nm] ASC,   [str_nm] ASC,   [stru_no] ASC,   [circt_nm] ASC,   [circt_cstdn_nm] ASC,   [data_orgtn_yr] ASC,   [circt_cstdn_user_id] ASC)WITH (PAD_INDEX  = OFF,STATISTICS_NORECOMPUTE  = OFF,SORT_IN_TEMPDB = OFF,IGNORE_DUP_KEY = OFF,DROP_EXISTING = OFF,ONLINE = OFF,ALLOW_ROW_LOCKS  = ON,ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]GO和
* L" P1 y* b4 a8 xcreate view vw_lookup_dvc_locasselectawc_txt,city_nm,str_nm,stru_no,circt_nm,o.circt_cstdn_nm as [owner],--o.circt_cstdn_user_id,t.circt_cstdn_nm as tech,data_orgtn_yrfrom vw_lookup_owner_test2 o With (NOEXPAND)join circt_cstdn ton o.circt_cstdn_user_id = t.circt_cstdn_user_idgroup byawc_txt,city_nm,str_nm,stru_no,circt_nm,o.circt_cstdn_nm,data_orgtn_yr,t.circt_cstdn_nm--o.circt_cstdn_user_id然后,我可以根据需要在第一个视图上添加索引。我不确定解决方案(或解决方案)是否会真正提高性能,但我会让你知道。
8 ?2 x$ e7 E8 g/ b1 s* R                                                                6 N% t% r7 }2 R* H
    解决方案:                                                               
( X' u+ n  J( `3 X2 l, S                                                                这是我从博客文章中得到的
/ r; j1 v  }3 h+ F" G- J6 h假设您想在dbo.circt_cstdn上加入2次,即您想要/ \4 U  R& h8 h$ s
                                    owner       techrowA     a.nm        b.nm6 l( X' Q1 j* d& o$ t) ^6 }" u
…与其将值分为两列,不如将值分为两行(以上每行为2行),并添加另一列来说明哪一行是哪一行。请注意,第一.1行和第1.2行数据相同(名称和列除外)
8 C6 Z- ~7 t7 O                                    name   forrow1.1   nm     owner
) Z- Y6 c! W/ R- ?6 M/ ]row1.2   nm     tech
4 `8 s6 I6 e, C$ n' w6 o0 x9 k! l…然后,您将重点放在所有者和技术人员的名称列的最大值上。-max函数只是用来欺骗的PIVOT(需要一些聚合函数),如果只有一个技术行记录所有者nm nm,任何返回相同值的聚合函数都可以使用。
  J3 h* d& ?* d% R
现在,如果我们为您查询) N& s, x% G  s8 D! l' A7 k  G
[ol]创建一个表d,像这样一个
' M" P6 @; C) q- t( D+ c$ P    i1; Y7 U/ B3 O$ A
    2与此交叉连接查询的第一部分, ^- L) f7 ]0 n6 q2 R/ n" k6 |
SELECT  count_big(*) as [count_all], awc_txt, city_nm, str_nm, stru_no, dvc.circt_nm, data_orgtn_yrFROM- j$ g# M3 s/ X3 Z
                    dbo.dvc# `9 B5 u: g! t! B& d- E
                    INNER JOIN dbo.circt on dvc.circt_nm = circt.circt_nm
$ k# T2 _1 G; i                    CROSS JOIN dbo.d2 U+ ~- T7 q+ f/ p7 d" V/ K% j2 x
GROUP BY! D) v3 S8 u% s- T" ^
                    awc_txt,city_nm,str_nm,stru_no,dvc.circt_nm,data_orgtn_yr,d.i现在,如果Di为1,使用所有者;如果Di2.使用技术行
; N1 Q- a5 A- d' G. j/ gSELECT  count_big(*) as [count_all], awc_txt, city_nm, str_nm, stru_no, dvc.circt_nm, data_orgtn_yr,Case      WHEN d.i = 1 THEN 'Owner     WHEN d.i = 2 THEN 'Tech' ENDFROM0 }, A. R6 m$ H. T4 I2 y1 I- m3 ]
                    dbo.dvc
( Q0 J: i7 z' y( u* \# U  f                    INNER JOIN dbo.circt on dvc.circt_nm = circt.circt_nm) H, N1 ]) U! _) H1 y
                    CROSS JOIN dbo.d 2 e; y+ f. p- C- S& k
GROUP BY
8 Q1 K3 X% s+ Q) M0 V& {0 Z% {- y                    awc_txt,city_nm,str_nm,stru_no,dvc.circt_nm,data_orgtn_yr,) o) y" I6 a5 Q& N- Q. i# v& g- [) [
                    Case
" H$ n7 `4 ]2 r& _3 H7 b                                    WHEN d.i = 1 THEN ‘Owner’6 [' s$ p3 U4 Q, E* P- Z' o% V7 l
                                    WHEN d.i = 2 THEN ‘Tech’
7 O, V/ [0 I% y: ]" ^. ^% `                    END  现在添加nm列。要得到名字,你可以circt_cstdn加入到circt,若是所有者行(di = 1),加入dvc,假如是技术行(di = 2)。注意-我在这里尝试了将其置于连接条件下的快捷方式。如果不起作用,请尝试博客发布(对circt.circt_cstdn_user_id     dvc.circt_cstdn_user_id连接,然后使用WHERE筛选子句)3 W3 V! {, {9 y1 g% E
SELECT  count_big(*) as [count_all], awc_txt, city_nm, str_nm, stru_no, dvc.circt_nm, data_orgtn_yr,Case      WHEN d.i = 1 THEN 'Owner     WHEN d.i = 2 THEN 'Tech' END as PersonType,circt_cstdn_nmFROM0 a0 D7 ]" f6 l
                    dbo.dvc3 Z8 i5 u, S3 i/ ^0 ^
                    INNER JOIN dbo.circt on dvc.circt_nm = circt.circt_nm5 [$ k/ c$ E- u% v- A
                    CROSS JOIN dbo.d
" I) p: f! Z0 X' v, e                    INNER JOIN dbo.circt_cstdn on circt_cstdn_user_id =
5 C  i" _8 M8 c, X# `3 @3 e                                        CASE
4 l7 Z2 s3 T. ]                                                            WHEN d.i = 1 THEN circt.circt_cstdn_user_id: a' C+ j4 T' f8 J
                                                            WHEN d.i = 2 THEN dvc.circt_cstdn_user_id
7 a% s$ N3 [2 W# S5 T5 K: A6 A                                        END& v% S4 V3 V; c% U
GROUP BY0 W- ]/ c$ d; {" v; O
                    awc_txt,city_nm,str_nm,stru_no,dvc.circt_nm,data_orgtn_yr,
; z* ?  @2 \; G1 ]( c( d7 \' h/ J                    Case 7 x" {5 R* a$ }, V  ]1 R9 ~  j
                                    WHEN d.i = 1 THEN ‘Owner’
- a7 d) N2 e7 e, Y* y                                    WHEN d.i = 2 THEN ‘Tech’
* Q, d) q) V. O5 D                    END,$ u6 x- y  W0 {! ]* p
                    circt_cstdn_nm创建视图并创建索引1 ~* s$ A) u7 u" y) ]1 m
create VIEW vw_lookup_test_imedWITH SCHEMABINDING
# \+ V8 P+ Z; e3 ], O# @; dAS
+ h* t$ b1 M' z2 w4 v/ Q# D                >
, H; s4 W/ }! k# A+ LGO
4 Y- _  q4 `1 |4 `9 ?. N4 Qspell to create INDEX现在,您将PIVOT转换为PersonType列到Owner和Tech列
* u+ _$ Q! E- w, K+ X0 SSELECT  count_all, awc_txt, city_nm, str_nm, stru_no, dvc.circt_nm, data_orgtn_yr,[Owner], [Tech]FROM ' F& ?1 |, P" g* \5 H
( . j8 j7 X( ~  D  R. g( g/ r
                    SELECT
  D: z. O8 ~8 S8 F  ~0 I# N                                        count_all,
1 W% w( C: O& d( H4 j                                        awc_txt,) a) [' ]! K& k* r& C
                                        city_nm,
9 [/ J7 \2 t/ f/ S                                        str_nm,
  l9 G9 o, O+ c% N# C. K5 K                                        stru_no,+ |* h7 f4 b6 k$ m/ I  l- I2 m
                                        dvc.circt_nm,
8 K8 q% e$ E8 `) H3 E- f                                        data_orgtn_yr,
) N, ]% i2 a, q                                        PersonType,- A5 C$ e% [4 H9 B: n. X
                                        circt_cstdn_nm
% R$ j( `2 h( K% ?2 \) b  d. a                    FROM dbo.vw_lookup_test_imed WITH (NOEXPAND)
5 _5 E" t# e$ E& j5 }. p$ d" M3 y) src 8 I* z( V) L0 B0 Q
PIVOT
# H) w' _% @! ~1 \/ H: c( ) H/ q5 h1 o) G) `
                    MAX(circt_cstdn_nm)
! J! w/ C; g8 ^3 I                    FOR PersonType IN ([Owner],[Tech]) / _9 W7 Y& q  f
) pvt
8 S* a' J& }+ G7 `* d5 k2 Z[/ol]如果有语法错误(一定有很多原因,因为我现在不能访问数据库),请告诉我。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则