回答

收藏

删除了PostgreSQL的文件``不存在''。

技术问答 技术问答 77 人阅读 | 0 人回复 | 2023-09-13

我正在使用postgreSQL9.1,并且想使用此提示从表中删除重复项:
9 d! ?' c( t9 `" a6 O& c另一种可能的方式是+ \! V( `% x& u& W$ b) ]
; + Q9 A+ p4 O3 G0 o
--Ensure that any immediately preceding statement is terminated with a semicolon above* d' s1 X+ X8 o
WITH cte- g" Z1 w2 \$ O5 F$ ]. \
     AS (SELECT ROW_NUMBER() OVER (PARTITION BY Col1, Col2, Col3
) j# L- K" S1 f- J2 ~# D                                       ORDER BY ( SELECT 0)) RN7 a1 y, C# `  w
         FROM   #MyTable)
& x% E8 Q2 B7 [; H- EDELETE FROM cte
* d+ f; s; p+ G6 d+ C, _WHERE  RN > 1;+ W9 @7 t* \4 C4 n' ~# f

: [+ m# z, U! j( u, p我在ORDER BY (SELECT 0)上面使用,因为在打平的情况下保留哪一行是任意的。
  s' D: L% p  O) y& I4 X为了保留最新的RowID顺序,例如,您可以使用ORDER BY RowID DESC& q( D6 _% K4 x
执行计划
3 v+ z: d/ f0 _' U. v; ~执行计划通常比接受的答案更简单,更有效,因为它不需要自我连接。& V1 C* P: v& {; r
执行计划1 x; J0 I  K' w7 |  m; R3 Z& M
但是,情况并非总是如此。一种GROUP BY可能是首选解决方案的地方是优先选择散列聚合而不是流聚合的情况。0 ?' ~0 d- ?% [9 w4 o, f7 W
该ROW_NUMBER解决方案将始终提供几乎相同的计划,而该GROUP BY策略则更为灵活。9 {& H7 T) L" a( [. ?8 [
执行计划
; H9 }/ y" y: S5 F, N6 j可能支持散列聚合方法的因素是. Q9 e% z2 q6 q+ ]
分区列上没有有用的索引
# [" H" I. K0 }8 P相对较少的组,每组中重复项相对较多1 \: ]- t1 F. q& D/ A& i/ V
在第二种情况的极端版本??中(如果每个组中很少有很多重复的组),还可以考虑简单地将行插入以保存到新表中,然后TRUNCATE对原始行进行-ing并将其复制回去,以最大程度地减少日志记录,相比之下删除一个行的比例很高。
7 k) ?4 Q0 \2 @因此,我的查询如下所示:+ x, V$ k- k0 |3 j
WITH cte/ b9 C  ^  d+ D, R! N
AS (SELECT ROW_NUMBER() 7 m( a& v* H( V( m$ v2 g$ G( \
OVER (PARTITION BY code, card_id, parent_id
+ g$ h5 _' Y9 O1 w     ORDER BY id DESC) RN4 R. Z( U, G0 v6 z- a0 G
     FROM card)
; Y$ C) {- x6 ^# ?DELETE FROM cte- [' U: g2 p, y2 o% k
WHERE RN > 19 T9 A, \0 J. w/ F, m0 z9 ?
但它告诉我1 P# |/ o" f( K
ERROR: relation "cte" does not exist, t3 T# \' B8 m* i
SQL state: 42P01
! t6 R- _! Y5 q( `' `; HCharacter: 1576 L- b, K! b3 [/ k9 t  ]. H3 K
但是,此语句可以正常工作:
6 V0 u' {. R7 i  f5 E' J: PWITH cte- o) r/ u: R1 F% M. y( ~
AS (SELECT ROW_NUMBER() 1 Z% J. U) P  o1 {$ e! W
OVER (PARTITION BY code, card_id, parent_id ( T. v( o# c6 c: Z" K' X: t
     ORDER BY id DESC) RN) o! j1 W& m8 d. d
     FROM merchantcard)
, j1 P/ @, F/ h# C8 HSELECT * FROM cte
4 e; f( M  B( w( C' a- l8 s: \, FWHERE RN > 1
7 r# [2 K& k- p9 }% `任何想法如何使它起作用?谢谢!. j3 X+ n! p* f3 ]! n
                0 c3 D+ X* F2 K+ h: j' L
解决方案:
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则