回答

收藏

与“相关”子查询的有效联接

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

给定Oracle中的三个表Dates(日期aDate,doUse布尔值),Days(rangeId整数,day整数,qty整数)和Range(rangeId整数,startDate日期)  Z% H0 ?& a* S" i. M) W, i, Z2 z
我想加入这些,以便将范围与aDate = startDate中的日期(其中doUse = 1,每天在Days中)结合在一起。/ _$ g6 P6 l. l0 q7 A
给定一个范围,可能会执行以下操作7 X; x8 ~& [9 N/ E! I
SELECT rangeId, aDate, CASE WHEN doUse = 1 THEN qty ELSE 0 END AS qty! M3 R  u; H! h
FROM (( z& J# |8 f; ?  N
    SELECT aDate, doUse, SUM(doUse) OVER (ORDER BY aDate) day# ~% I: p9 F9 X
    FROM Dates # j0 Y% E' {, J1 l0 F
    WHERE aDate >= :startDAte
6 C$ N3 U- u5 k. Y) INNER JOIN (
1 Z/ d) |9 M* U! m( ^    SELECT rangeId, day,qty( P7 i# z" D* [9 H$ F) y, E
    FROM Days
0 R+ ^# ~; R" V: o* {) t, a    WHERE rangeId = :rangeId* R  g8 `/ z8 X0 }$ }) ~! {  P
) USING (day)
" d% c* ]$ b/ d7 H: \ORDER BY day ASC8 [2 I! v! ]5 B9 y+ R4 u) r1 t
我想做的是查询范围中的所有范围,而不仅仅是一个。
5 U$ z" i  J. X3 V2 P+ ^问题在于联接值“ day”取决于要计算的范围startDate,这给我编写查询带来了一些麻烦。) O' Q8 x% J0 z" v- y; V( ^
请记住,“日期”表非常庞大,因此我希望避免从表中的第一个日期开始计算日期值,而每个“范围天”不应超过100天左右。
9 H7 I, y. s0 c( D* t$ z0 H- s编辑:样本数据: s  A$ v9 Q4 ~$ r
Dates                            Days
& k& o. }$ ^- N- \  aaDate        doUse               rangeId     day     qty; U+ ~( u* p% z
2008-01-01   1                   1           1       1
. I+ B2 J! C0 J  n  a2008-01-02   1                   1           2       10: j! z( `7 r( M! [  R4 ?; Z4 Z" E( @% g
2008-01-03   0                   1           3       8
1 k/ m2 A  `, {1 T% S2008-01-04   1                   2           1       2- a; c( |9 Y8 l8 n$ H& E( K
2008-01-05   1                   2           2       5
; K+ x5 y" Z. V: c& j: Y9 m3 ^Ranges! y5 W; [6 [( m7 b& D. M; T' Z2 @
rangeId      startDate
6 G1 A* d9 N+ X9 l1            2008-01-02
; B/ J# ]' M' W% y: B* T* v: I9 f2            2008-01-034 L) g6 Q; [7 y$ c0 n5 I, t

6 y# T+ q2 j8 o% s! BResult
" e2 t: \( {4 I' grangeId      aDate        qty3 w4 E  @7 V  n/ P
1            2008-01-02   1
9 _* ]" ]: w" I/ i1            2008-01-03   0$ D- r6 k1 H! l5 }
1            2008-01-04   10
4 s4 T' h( X  G; }) e+ }1            2008-01-05   8
5 t" j4 ~+ E$ i9 |2            2008-01-03   0
. |$ J* @2 n6 ^* Z: u2            2008-01-04   2  F- L9 y. I4 S: |& r, m0 k2 r
2            2008-01-05   5
$ e+ M7 Z1 P) m' T+ @* f5 K, I               
2 {+ V5 c- J) _. W, t) v: e解决方案:
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则