回答

收藏

关于WITH RECURSIVE查询Postgres的可能解释

技术问答 技术问答 290 人阅读 | 0 人回复 | 2023-09-14

我一直在阅读Postgres中的With Query。这就是我很惊讶的地方
  Y  M$ |6 b0 I& b) }# v1 D# jWITH RECURSIVE t(n) AS (
$ `  c* u6 v  V3 V# b    VALUES (1)
" E% y7 O' R4 l7 {8 X! j  UNION ALL
0 K3 H5 g! F  w- @( F  @0 \* @    SELECT n+1 FROM t WHERE n 我不明白查询的评估是如何工作的。$ }* Y1 g7 n# L3 j( f, a
t(n)听起来像是带有参数的函数。n的值如何传递。) N* C  Y8 L6 z: I. e8 Z" P. ?

8 B) X+ E5 s9 I1 w5 E' v关于SQL递归语句如何分解的任何见解。* \; B: c+ v: g+ Y8 a* a5 e" M3 Y
                1 U; N2 ]3 x6 d* S9 D$ x: b
解决方案:
/ K1 h# m: W( @5 j% u                8 a+ s/ p( n" Q: |/ ]

6 t- @  A0 m2 J& e& B4 V* X$ A7 |1 k2 q5 n% ]0 D: O
                这称为公用表表达式,是在SQL中表示递归查询的一种方式:
: w3 L) H6 `) B9 \- it(n)将CTE的名称定义为t,其中有一个名为的列n。它类似于派生表的别名:  U* L2 B$ \; l. e7 }
select ... + X  F) B  {2 L6 R* U' c& o1 i; U
from ($ Q6 `; A# X3 J/ X; ]
  .../ ?9 k8 k9 v" U+ X5 M9 m
) **_as t(n)_** ;# T' ]6 P5 i; h) d! j% ?, P( r6 m
递归从值1开始(即values (1)部分值),然后递归地将值加1,直到达到99。因此它将生成从1到99的数字。然后最终查询将所有这些数字相加。; c% X# E' a# c" @0 A
n是列名, 而不是 “变量”,并且“赋值”的发生方式与任何数据检索相同。
% G1 U$ ~" M; \7 V' L0 B/ L- oWITH RECURSIVE t(n) AS (
! ^9 N* A' E/ L; C! ~4 a, x$ X3 F    VALUES (1) -- **如果您“展开”递归(实际上是一个迭代),那么您将得到如下所示的结果:
- T1 f) L/ f: Y6 [. {+ I, Rselect x.n + 1) Z8 a+ c9 W4 m2 l4 E4 Y
from (
# C5 |, I& r/ @! E5 V. L  select x.n + 1
% @) B( ~/ q1 O# _  from (
, y' b4 a! }$ R  Z/ J! T    select x.n + 1
3 ]( w; ]4 p0 i4 v* I    from (
% j% L2 R4 D; |+ D$ N# \& s      select x.n + 12 O8 k1 Z. c6 S& ~
      from (- [4 L3 z! s* I
         values (1)! k& d1 W# M6 v3 d2 R, A" A, E
      ) as x(n)
+ Q9 g8 F+ P" h( P    ) as x(n)
; [: p& O$ R/ w$ D  j  ) as x(n)6 n' G% m5 D6 V
) as x(n)8 t: b6 ?/ x1 t7 E' }# L" X
手册中的更多详细信息:https :
! D* m1 V- G* L9 _4 S4 v//www.postgresql.org/docs/current/static/queries-0 V' Q5 u# |5 M  s
with.html
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则