回答

收藏

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

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

给定Oracle中的三个表Dates(日期aDate,doUse布尔值),Days(rangeId整数,day整数,qty整数)和Range(rangeId整数,startDate日期)
9 u; T4 J6 V3 K: c' q; n1 m我想加入这些,以便将范围与aDate = startDate中的日期(其中doUse = 1,每天在Days中)结合在一起。( ~4 O- B' h- x
给定一个范围,可能会执行以下操作
# x* H- B% R+ ~- O: Z% hSELECT rangeId, aDate, CASE WHEN doUse = 1 THEN qty ELSE 0 END AS qty( ^" f+ h; o. j+ m2 o8 S' L
FROM (
* w! N+ ?9 k# O    SELECT aDate, doUse, SUM(doUse) OVER (ORDER BY aDate) day
$ X+ s1 U# I6 U8 f! c9 w    FROM Dates : W( P7 x+ m+ b
    WHERE aDate >= :startDAte
" n6 t& n- S0 }9 D) INNER JOIN (  T; ]9 b6 ~# b8 u6 O9 G: @0 `4 E. I
    SELECT rangeId, day,qty
0 r, V1 b" O! W5 ^9 Z$ ~1 l    FROM Days7 f5 U4 v& I" T) D, |9 W% z* L
    WHERE rangeId = :rangeId
! v2 v# `1 Z7 k- |& J2 Z1 j) USING (day), m& H, z$ r' e# e# P  L1 b/ \
ORDER BY day ASC
( X7 N' m- {" D; H* V我想做的是查询范围中的所有范围,而不仅仅是一个。* g+ K, |0 R# y8 J4 o  k2 p! X
问题在于联接值“ day”取决于要计算的范围startDate,这给我编写查询带来了一些麻烦。
* Q/ K* F- S& f% A* R' T请记住,“日期”表非常庞大,因此我希望避免从表中的第一个日期开始计算日期值,而每个“范围天”不应超过100天左右。
) p0 X( }7 F8 ~2 L8 V. s+ _编辑:样本数据
5 @5 F6 [. u' Z2 cDates                            Days( K- N9 C4 @- W8 w* Y" R# a
aDate        doUse               rangeId     day     qty
+ X- {9 b, G2 ~6 W, J; f2008-01-01   1                   1           1       1
+ T7 E' q5 }0 \& m5 y/ f2008-01-02   1                   1           2       109 b3 x' t8 |+ V! ]% Q0 u! X
2008-01-03   0                   1           3       8. }6 ?( i1 t( ?( h3 i
2008-01-04   1                   2           1       2+ z8 G% E4 f! q9 M- h3 ^
2008-01-05   1                   2           2       5
6 j9 x% c* H4 wRanges
. `& o$ Q6 L, f' Q, HrangeId      startDate
; X, [3 C: U& d5 b; B2 [1            2008-01-023 Q& ?- J) `  x) w  z
2            2008-01-03" z& C, o! h5 `0 n. x/ i

& g/ L1 A+ x0 V# yResult4 k9 d4 T5 e# E; R9 o3 p; o8 n
rangeId      aDate        qty
4 ]; G/ m5 E' ^5 f1            2008-01-02   13 L" [' |7 a" x" K7 c/ g9 k9 l
1            2008-01-03   08 C3 X1 a; x; I7 H+ V6 P
1            2008-01-04   10
6 m: \0 n( J) ~  u1            2008-01-05   8. L0 s" G4 c% `/ v. u" t9 ?8 {4 v
2            2008-01-03   0/ x5 k( Q& x: k
2            2008-01-04   2  y; \/ h! G4 \
2            2008-01-05   5; p! u! }) c9 n) S; t
                0 h, _, |5 @% ]
解决方案:
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则