使用Postgres 8.4中的每一行调用一次函数进行更新
技术问答
224 人阅读
|
0 人回复
|
2023-09-14
|
我有以下UPDATE语句:
9 s3 |: {2 y& H$ u+ o0 `7 e7 b# vupdate mytable
4 f( Y. K2 d! Y, A6 G+ f set a = first_part(genid()),3 Y+ k+ x. ?( M5 H4 F7 j5 D
b = second_part(genid()),
, ~/ B/ a1 x2 u1 j1 j1 c c = third_path(genid())
! ]+ v, c: M1 o, `9 A; k' w where package_id = 10;0 g9 ]: ^5 |* E
在此示例中,该函数genid()每行被调用三次,这是错误的-我希望该函数的每行仅被调用一次mytable。
9 ^& t: b! w7 s% ?3 ]) `! R: Y, p我正在使用PostgreSQL 8.4数据库。如何编写正确的更新?! a" `6 `; O! m# w; z
我已经尝试过这样的事情:) P [- q- {: c) N
update mytable* P) j" \( J7 C! _
set a = first_part(g),
! N' o) { L/ X9 q0 B4 g b = second_part(g),1 T( j0 O3 X! Z% R3 {
c = third_path(g)- e9 x* w; W: [: ?9 ]$ w
where package_id = 10
5 o* D5 \ H1 M+ x from genid() as g;9 ^* f0 q) }. o% f" [
但这没有用,因为整个更新语句genid()仅被调用了 一次 。
, w4 P- s. B! }( `
) Z; A; [2 _( S* y# N解决方案:
( G8 ^& _, n8 H* b- D8 V, B3 v( [ . d# c$ Z! ^: B R) _ F
4 @+ U' B; V. y# U1 c* n
9 K' o4 s0 H# H6 o 您是否尝试过Postgres的非标准UPDATE .. FROM条款?我想这会起作用
/ I# b2 M* {+ Oupdate mytable, w3 @1 P' c- p* q
set a = first_part(gen.id),( U; b+ h1 R0 h9 _( _
b = second_part(gen.id),, i3 n# r% `- y; r- s
c = third_path(gen.id)1 f [. j2 e: V2 \7 [6 ]0 J2 c6 e
from (
@8 J( i1 \6 e8 E, `& { C select genid() as genid, id
# `% N; g2 l, ]% v2 ]9 S! n' r from mytable # {' l; ]9 X9 N2 R. ?( U: g
where package_id = 10' V% }: x3 O& u0 V) D1 g1 {
) gen( a# @: W$ Z. h1 s5 {
where mytable.id = gen.id;& W: }4 d7 L( E* Z& F, ]
--and package_id = 10 -- This predicate is no longer necessary as the subquery
! [2 K/ O- ]9 S% u -- already filters on package_id, as Erwin mentioned
0 _$ O" O9 h; k( ], K6 a请注意,我强制在子选择内genid()每个记录仅被调用一次mytable。然后,我将自我加入mytable并gen使用一个假设的id专栏。请参阅此处的文档:
- I. |3 n S( F+ ]# Bhttp://www.postgresql.org/docs/current/interactive/sql-
4 o- V' k9 X* G8 [update.html |
|
|
|
|
|