现有如果情况的数据 一张表有下列数据
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个 求大侠指教啊,效率最好高点啊

解决方案 »

  1.   


    SELECT X,
           RTRIM(LTRIM(REPLACE(REPLACE(WM_CONCAT() OVER(PARTITION BY X), Y, ''),
                               ',,',
                               ','),
                       ','),
                 ',') Y,
           Z
      FROM (SELECT * FROM T ORDER BY X, Z)
      

  2.   

    你妹的csdn 我的2楼哪里去了,里面有解决的sql,擦的。。
      

  3.   

    create table t(X int,  Y int,  Z varchar2(10));
    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后面的,
      

  4.   

    这种思考方式的确不错,但如果XY都相同的情况出现,可能就不符合题意了。根据题意可以引入rowid和distinct去重
      

  5.   

    你妹的csdn 我的2楼哪里去了,里面有解决的sql,擦的。。