回答

收藏

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

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

给定Oracle中的三个表Dates(日期aDate,doUse布尔值),Days(rangeId整数,day整数,qty整数)和Range(rangeId整数,startDate日期)
  D  L' d; u& P我想加入这些,以便将范围与aDate = startDate中的日期(其中doUse = 1,每天在Days中)结合在一起。# ]% h( b% k# ]" u/ Q: T
给定一个范围,可能会执行以下操作+ w  h$ Q1 ]( T& b
SELECT rangeId, aDate, CASE WHEN doUse = 1 THEN qty ELSE 0 END AS qty3 V% x' u, w1 C& u4 a# T4 N
FROM (
! @% n3 a/ R; D8 M0 H2 e: D  G! P    SELECT aDate, doUse, SUM(doUse) OVER (ORDER BY aDate) day
. u5 C: N! [/ b! V2 R5 D# s    FROM Dates
3 ?  ~" q5 v$ K    WHERE aDate >= :startDAte
+ x# F6 M9 \; }4 r0 w# E) INNER JOIN () _. O& s( K& n, U% t1 f
    SELECT rangeId, day,qty
( q3 ^8 k! E2 f3 ?# v    FROM Days1 [3 Y0 c" R- e
    WHERE rangeId = :rangeId4 u8 z+ f+ `7 @: Z
) USING (day)# i# R( T1 L/ d  p2 t
ORDER BY day ASC. T4 R: T4 v. ?4 j9 V
我想做的是查询范围中的所有范围,而不仅仅是一个。+ }5 O4 F& L3 x! a1 o' _" N
问题在于联接值“ day”取决于要计算的范围startDate,这给我编写查询带来了一些麻烦。" z3 k& K" W9 q2 b9 C3 g9 s
请记住,“日期”表非常庞大,因此我希望避免从表中的第一个日期开始计算日期值,而每个“范围天”不应超过100天左右。" G# H8 U- M2 ?
编辑:样本数据
7 k( k0 m3 S0 }$ |! ?" IDates                            Days
% B# u) _* _6 B! n$ VaDate        doUse               rangeId     day     qty) {$ Z- Q5 m' V
2008-01-01   1                   1           1       1
) w' i0 Q# ^8 e9 a% F! T  e3 w) t" i2008-01-02   1                   1           2       10
( o! I, x$ U, Z- _2008-01-03   0                   1           3       8
  _1 C& ?4 w) t. g" s$ q* k, T$ s2008-01-04   1                   2           1       2. G0 P, U. y$ g2 q1 N
2008-01-05   1                   2           2       54 T4 h) b" A% b
Ranges; ]2 F- n% j' s6 n) K# I8 e
rangeId      startDate( {2 z6 j' G+ T  P7 b# g! u
1            2008-01-021 d2 ~( z- l* O4 H
2            2008-01-03
* D0 J! C+ q% V# a1 I) T3 X; F! a4 Q3 s) u' B+ H) P: G
Result
( \: S' ], M6 y( [, C; orangeId      aDate        qty
" b3 p, B5 f5 F+ f1 |1            2008-01-02   1/ s! O! i) d- g( ^' e, S
1            2008-01-03   0
- s1 C' i4 g; f. k. Y" l) n0 f1            2008-01-04   10
. l8 s. {/ R  n; K6 F1            2008-01-05   8
" p) ^, y: ~# x  Q: @2            2008-01-03   0- N+ Q! I4 ~! m" r7 y5 ?
2            2008-01-04   2
; `# \3 R5 r7 ^2            2008-01-05   5' n2 o' i! X6 K5 G
               
  j% j8 @4 Q1 f解决方案:
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则