现在又A,B两张表,如下:
table A
SU_IDS UPDATE
-----------------------
25,26 2009-5-6 14:26:24
24 2009-5-6 14:26:25
21,22,23 2009-5-6 14:26:26
table B
ID NAME
-----------------------
21 张三
22 李斯
23 王武
24 赵六
25 阿达
26 阿尔求高手帮我改一下下面的sql:
select A.SU_IDS,A.UPDATE,? AS SU_NAMES
from A,B
where ????
使得可以得到如下所示的表C.
table C
SU_IDS UPDATE SU_NAMES
-----------------------
25,26 2009-5-6 14:26:24 阿达,阿尔
24 2009-5-6 14:26:25 赵六
21,22,23 2009-5-6 14:26:26 张三,李斯,王武

解决方案 »

  1.   

    SU_IDS 是什么数据类型啊?
      

  2.   

    select a.su_ids,a.update,b.name as su_names
    from a,b
    where b.id in (a.su_ids) ;
      

  3.   


    A.SU_IDS NVARCHAR2(500) Y
    B.ID NUMBER N
      

  4.   


    不好意思,我刚才没说清楚,SU_IDS是用 非数字的任意特殊符号()分开的。
      

  5.   

    CREATE TABLE TABLE_A
    (SU_IDS VARCHAR2(100),
    UPDATE_time DATE
    );
    INSERT INTO TABLE_A VALUES('25,26'   ,TO_DATE('2009-5-6 14:26:24','YYYY-MM-DD HH24:MI:SS')); 
    INSERT INTO TABLE_A VALUES('24'      ,TO_DATE('2009-5-6 14:26:25','YYYY-MM-DD HH24:MI:SS')); 
    INSERT INTO TABLE_A VALUES('21,22,23',TO_DATE('2009-5-6 14:26:26','YYYY-MM-DD HH24:MI:SS'));
    commit;CREATE TABLE TABLE_B
    (ID VARCHAR2(10),
    NAME VARCHAR2(100)
    );INSERT INTO TABLE_B VALUES('21','张三'); 
    INSERT INTO TABLE_B VALUES('22','李斯'); 
    INSERT INTO TABLE_B VALUES('23','王武'); 
    INSERT INTO TABLE_B VALUES('24','赵六'); 
    INSERT INTO TABLE_B VALUES('25','阿达'); 
    INSERT INTO TABLE_B VALUES('26','阿尔'); 
    COMMIT;SELECT DISTINCT RR.SU_IDS,
                    RR.UPDATE_TIME,
                    WMSYS.WM_CONCAT(NAME) OVER(PARTITION BY RR.SU_IDS, RR.UPDATE_TIME) AS NAMES
      FROM (SELECT R.SU_IDS,
                   R.UPDATE_TIME,
                   R.NAME
              FROM (SELECT A.SU_IDS,
                           A.UPDATE_TIME,
                           INSTR(A.SU_IDS,
                                 B.ID) AS IN_FLAG,
                           B.NAME
                      FROM TABLE_A A,
                           TABLE_B B --- 
                    ) R
             WHERE R.IN_FLAG > 0
             ORDER BY R.IN_FLAG ---
            ) RR
     
      

  6.   

    结果SU_IDS         UPDATE_TIME         NAMES
    24         2009-5-6 14:26:25 赵六
    25,26         2009-5-6 14:26:24 阿尔,阿达
    21,22,23 2009-5-6 14:26:26 张三,李斯,王武
      

  7.   

    更新下,上面的排序有问题。
    SELECT DISTINCT RR.SU_IDS,
                    RR.UPDATE_TIME,
                    WMSYS.WM_CONCAT(NAME) OVER(PARTITION BY RR.SU_IDS, RR.UPDATE_TIME) AS NAMES
      FROM (SELECT R.SU_IDS,
                   R.UPDATE_TIME,
                   R.NAME
              FROM (SELECT A.SU_IDS,
                           A.UPDATE_TIME,
                           INSTR(A.SU_IDS,
                                 B.ID) AS IN_FLAG,
                           B.NAME
                      FROM TABLE_A A,
                           TABLE_B B --- 
                    ) R
             WHERE R.IN_FLAG > 0
             ORDER BY R.SU_IDS,R.IN_FLAG ---
            ) RR
     ORDER BY RR.SU_IDS
    ---------------------------------------
    结果
    SU_IDS UPDATE_TIME NAMES
    21,22,23 2009-5-6 14:26:26 张三,李斯,王武
    24 2009-5-6 14:26:25 赵六
    25,26 2009-5-6 14:26:24 阿达,阿尔
      

  8.   


    厉害有没有试过如果有id为2的user,会不会有bug呀。
      

  9.   

    如果有id为2的user?怎么个理解?
      

  10.   

    我刚才运行,弹出这个窗口: ORA-00904: "WMSYS"."WM_CONCAT": 标识符无效 
      

  11.   

    1、用户没有权限
    2、xe版的oracle,没有WMSYS用户
      

  12.   

    他的意思是“某ID内容如果是其他ID的子字符串”,用substr会出BUG比如,将下边2行插入到你定义的表,就会出现错误INSERT INTO TABLE_A VALUES('2,22,23',TO_DATE('2009-5-6 14:26:26','YYYY-MM-DD HH24:MI:SS'))
    INSERT INTO TABLE_B VALUES('2','刘二')
      

  13.   

    是啊,如果是cco3322 那样,就不行了啊。哎。。
      

  14.   

    你说的这个问题上面的语句是解决不了,但是只需稍稍改动即可,但必须满足1个条件:
    --->TABLE_A中的SU_IDS是用 非数字的任意特殊符号()分开的,且这个特殊符号是固定的,不能是这样,12,23.24;25  必须是 12,23,24,25
    具体的sql见楼下
      

  15.   

    -------------------- 测试表
    CREATE TABLE TABLE_A
    (SU_IDS VARCHAR2(100),
    UPDATE_time DATE
    );
    INSERT INTO TABLE_A VALUES('25,26'   ,TO_DATE('2009-5-6 14:26:24','YYYY-MM-DD HH24:MI:SS')); 
    INSERT INTO TABLE_A VALUES('24'      ,TO_DATE('2009-5-6 14:26:25','YYYY-MM-DD HH24:MI:SS')); 
    INSERT INTO TABLE_A VALUES('21,22,23',TO_DATE('2009-5-6 14:26:26','YYYY-MM-DD HH24:MI:SS'));
    INSERT INTO TABLE_A VALUES('2,22,23',TO_DATE('2009-5-6 14:26:26','YYYY-MM-DD HH24:MI:SS'));-----> 注意
    commit;CREATE TABLE TABLE_B
    (ID VARCHAR2(10),
    NAME VARCHAR2(100)
    );INSERT INTO TABLE_B VALUES('21','张三'); 
    INSERT INTO TABLE_B VALUES('22','李斯'); 
    INSERT INTO TABLE_B VALUES('23','王武'); 
    INSERT INTO TABLE_B VALUES('24','赵六'); 
    INSERT INTO TABLE_B VALUES('25','阿达'); 
    INSERT INTO TABLE_B VALUES('26','阿尔'); 
    INSERT INTO TABLE_B VALUES('2','刘二');-----> 注意
    COMMIT;
    ------------------  SQL
    SELECT DISTINCT RR.SU_IDS,
                    RR.UPDATE_TIME,
                    WMSYS.WM_CONCAT(NAME) OVER(PARTITION BY RR.SU_IDS, RR.UPDATE_TIME) AS NAMES
      FROM (SELECT R.SU_IDS,
                   R.UPDATE_TIME,
                   R.NAME
              FROM (SELECT A.SU_IDS,
                           A.UPDATE_TIME,
                           INSTR(','||A.SU_IDS||',', ---------------- 前后并上',',来解决问题
                                 ','||B.ID||',') AS IN_FLAG,
                           B.NAME
                      FROM TABLE_A A,
                           TABLE_B B --- 
                    ) R
             WHERE R.IN_FLAG > 0
             ORDER BY R.SU_IDS,R.IN_FLAG ---
            ) RR
     ORDER BY RR.SU_IDS
     
    ----------------结果
    SU_IDS     UPDATE_TIME NAMES             
    ---------- ----------- ------------------
    2,22,23    2009-5-6 14 刘二,李斯,王武
    21,22,23   2009-5-6 14 张三,李斯,王武
    24         2009-5-6 14 赵六
    25,26      2009-5-6 14 阿达,阿尔
      

  16.   

    不错啊,很好了,不过还是有点不对劲哦:
     suncrafted ,你看到了吗,有重复的数据哦,你放大图片看一下就看到了,再帮我改改哦??