回答

收藏

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

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

给定Oracle中的三个表Dates(日期aDate,doUse布尔值),Days(rangeId整数,day整数,qty整数)和Range(rangeId整数,startDate日期)
/ p+ [1 f* y3 O; @2 [我想加入这些,以便将范围与aDate = startDate中的日期(其中doUse = 1,每天在Days中)结合在一起。
( S. k9 C' V* n7 u2 ]3 U给定一个范围,可能会执行以下操作% s6 V( k- I3 e, Q
SELECT rangeId, aDate, CASE WHEN doUse = 1 THEN qty ELSE 0 END AS qty9 I, Z- v( L4 s! _
FROM (( J+ q5 [3 O1 j  {+ y
    SELECT aDate, doUse, SUM(doUse) OVER (ORDER BY aDate) day  K! @) {+ R2 K2 a2 h' j: {
    FROM Dates ) P( k% g, I( L7 d
    WHERE aDate >= :startDAte- k: v$ v2 o( Q5 V' V& m
) INNER JOIN (# D( M6 h2 N3 @* I5 W) S% @( W
    SELECT rangeId, day,qty8 K4 ^+ D2 y1 u8 b) G, d
    FROM Days
7 M& C9 p5 l3 w7 F" J5 `; ]% s1 k    WHERE rangeId = :rangeId
5 n! A  b5 _5 t& K4 U. x" u, b) USING (day)
; {* W1 l+ d. N1 FORDER BY day ASC
: |+ z/ i/ q2 W+ X' [& G, N# O我想做的是查询范围中的所有范围,而不仅仅是一个。( t* D  y. e9 ]/ M
问题在于联接值“ day”取决于要计算的范围startDate,这给我编写查询带来了一些麻烦。
+ N  N) n" g! z$ D. T% D$ Y$ ^  k: F) m请记住,“日期”表非常庞大,因此我希望避免从表中的第一个日期开始计算日期值,而每个“范围天”不应超过100天左右。$ X2 ~- b/ s% U3 d) c
编辑:样本数据" t! z$ E8 e0 \. _' X/ G/ y$ |3 n
Dates                            Days
5 S7 e! Z# A% g* C* f! I0 XaDate        doUse               rangeId     day     qty/ ^% `; n( o* g% q
2008-01-01   1                   1           1       1
) |8 S3 @; M; i0 E+ G% D! R$ E2008-01-02   1                   1           2       10
: e+ V" z1 u- V2008-01-03   0                   1           3       8$ Z! w8 S. p( }1 S; X) A# |) m% C
2008-01-04   1                   2           1       2
9 ~! a4 c$ F5 v  q' \2008-01-05   1                   2           2       5
0 a& ?2 h. x  G7 }$ ], aRanges0 ]. D7 g; O  x& w- u
rangeId      startDate- H. `2 L7 ]: }- Z
1            2008-01-02
+ {( I; X" S0 ]9 E& i  G8 ], h2            2008-01-033 d* D* y0 \. o0 c0 j

' f% d* o9 }, o3 _- _) rResult) z! X! V4 p0 u9 v5 Q- R9 r
rangeId      aDate        qty
" Y: e! c/ I5 w' o- ]7 \& T7 m. M1            2008-01-02   19 [2 ?, J$ ^/ ~9 d
1            2008-01-03   0
. z+ R4 `# i& e2 f, g1            2008-01-04   10" u5 Y; j" F8 p0 o
1            2008-01-05   8
2 X2 E# i4 Z* p% g7 d8 L' f2            2008-01-03   0- V% i8 ~1 N& T% W2 p
2            2008-01-04   29 o, Q) R& e! [9 `
2            2008-01-05   59 E0 N5 u. S! B0 Z
                : I6 u% Q) g) o' m
解决方案:
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则