现有如果情况的数据 一张表有下列数据
X Y Z
1 11 a
1 12 b
1 13 c
3 31 e
3 32 f
注:表中每条数据肯定会有另一与之X相等的数据 即X某一值肯定会出现两次以上我想查询时查询结果是 (查出所有与X值相同的数据的Y字段并把Y拼接成字符串)
X Y Z
1 12,13 a
1 11,13 b
1 11,12 c
3 32 e
3 31 f注:表中数据可能上千万,但一般同一X对应Y的值不会超过100个 求大侠指教啊,效率最好高点啊
X Y Z
1 11 a
1 12 b
1 13 c
3 31 e
3 32 f
注:表中每条数据肯定会有另一与之X相等的数据 即X某一值肯定会出现两次以上我想查询时查询结果是 (查出所有与X值相同的数据的Y字段并把Y拼接成字符串)
X Y Z
1 12,13 a
1 11,13 b
1 11,12 c
3 32 e
3 31 f注:表中数据可能上千万,但一般同一X对应Y的值不会超过100个 求大侠指教啊,效率最好高点啊
SELECT X,
RTRIM(LTRIM(REPLACE(REPLACE(WM_CONCAT() OVER(PARTITION BY X), Y, ''),
',,',
','),
','),
',') Y,
Z
FROM (SELECT * FROM T ORDER BY X, Z)
insert into t values(1, 11, 'a');
insert into t values(1, 12, 'b');
insert into t values(1, 13, 'c');
insert into t values(1, 1211, 'g');
insert into t values(3, 31, 'e');
insert into t values(3, 32, 'f');
with t1 as (
select x, y, z, ','||wm_concat(y) over (partition by x)||',' y1 from t
)
select x,
regexp_replace(regexp_replace(replace(y1, ','||y||',', ','), '^,',''), ',$', '') y,
z from t1;---结果--
X Y Z
---------- -------------------- ----------
1 12,1211,13 a
1 11,1211,13 b
1 11,12,13 g
1 11,12,1211 c
3 31 f
3 32 e说说思路,
先把相同X的Y用wm_concat合并成 ,11,12,13,1211, 的字符串S
然后,例如,
对于Y=11的行,从S中替换 ,11, 成为 , 这样S=,12,13,1211,
对于Y=12的行,从S中替换 ,12, 成为 , 这样S=,11,13,1211,
...
然后去掉S前面的,
然后去掉S后面的,