回答

收藏

PostgreSQL 9.1:如何连接数组中没有重复的行,加入另一个表

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

我使用的是PostgreSQL
0 x5 _3 h: t! u/ t9.1,需要将多个行串联在一起的帮助。我需要在2个表中执行此操作。当我使用两次array_agg()函数时,会得到重复的值。
* o2 I4 {% K0 u+ r( q9 B表格:
+ A+ q' U( m, A' P8 H/ @& G! QCREATE TABLE rnp (id int, grp_id int, cabinets varchar(15) );
) S% l% h- [- ?: l$ C. E% k7 L: iINSERT INTO rnp VALUES
  W$ s( n! _% x) x1 F (1,'11','cabs1')
2 p0 }: `  }' U/ ~$ R8 Q8 K8 ?( g,(2,'11','cabs2')8 x6 o/ y( N+ |- H: C0 R
,(3,'11','cabs3')
) j) M9 ?. N0 S,(4,'11','cabs4')3 y3 t" q' p6 r" p- W% Q
,(5,'22','c1')
3 X3 [7 b$ B. p1 a' U2 {  u,(6,'22','c2');
& g: r/ M8 T+ J4 PCREATE TABLE ips (id int, grp_id int, address varchar(15));
! l& _- U0 A# R5 W& vINSERT INTO ips VALUES/ |7 ?" Y, p: z9 J" [
(1,'11','NY')% ^+ b: a/ Z/ K1 h2 l8 e
,(2,'11','CA')
- e( p7 l5 h" g, c( X,(3,'22','DC')
' L7 ]% e& c. q9 n, O,(4,'22','LA');
* K( Y& c1 {2 E0 ^  T$ tSQL:
! [! q8 t! O" CSELECT DISTINCT+ e) _' A& K" G( B1 x
  rnp.grp_id,+ W3 \9 U( `  S& o
  array_to_string(array_agg(rnp.cabinets)OVER (PARTITION BY rnp.grp_id), ',') AS cabinets,3 N% w/ F! H+ i, i( U
  array_to_string(array_agg(ips.address) OVER (PARTITION BY ips.grp_id), ',') AS addresses
0 R% Z1 X* E8 L: Y4 j6 R: E: i; P, |' N
FROM rnp JOIN ips ON rnp.grp_id=ips.grp_id; a5 j: {' M: {' u. u& ~
结果:" [8 `  e+ A  ?7 H1 Y) g3 ^6 E; f9 H
GRP_ID  CABINETS                                             ADDRESSES
6 C) L7 I7 B6 L& g& `11  cabs1,cabs1,cabs2,cabs2,cabs3,cabs3,cabs4,cabs4     NY,CA,NY,CA,NY,CA,NY,CA& \3 g3 i1 _8 O" n
22  c1,c1,c2,c2                                             DC,LA,DC,LA
5 u1 X$ \% ]% ~8 N* q% G) R" G我需要的是:; r/ W& _+ t) O
GRP_ID     CABINETS                 ADDRESSES
# [8 C, o3 Q+ @: V3 i( [, g. C' s    11  cabs1,cabs2,cabs3,cabs4       NY,CA,
+ _0 @0 e" r( p9 b8 Q# _4 ?3 {    22  c1,c2                         DC,LA: r! W: ^* B1 E1 R
SQLFiddle中的此示例:http
4 S. g# `- |/ n8 t://sqlfiddle.com/#!1/4815e/19
3 Q6 q# _- w# |. s9 d# k如果使用一个表,则没有问题-SQLFiddle:http
5 W6 z2 k% C) U* g://sqlfiddle.com/#!1/4815e/20
. A' }! {" d# ~% H: C  W" f由于JOIN,有可能做到这一点吗?
" T. f' u. g+ \- k                $ y7 O) F( p& f# g3 m/ n. V# T* ^
解决方案:
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则