某个表里面有个字段存的是多个id,中间用逗号隔开的,
比如 这个字段的值为:P00008,P00004,P00006,P00005,P00007
二这种id编号对应的就是一个product产品表
这个产品表的字段有 product_id,productdesc对应关系
P00008,A产品
P00004,B产品
P00006,C产品
P00005,F产品
P00007,Z产品
P00009,G产品
P00003,T产品
可能这个表还有其他产品的id,而且对应的的A表的那个字段也有可能记录其他的id需要显示出来这个字段的内容为
A产品,B产品,C产品,F产品,Z产品
请问如何通过sql实现?

解决方案 »

  1.   


    SQL> --这种设计上是有问题的,违反关系数据库最基本的第一范式。
    SQL> --造成关系运算的麻烦,所以尽可能从设计上解决问题。
    SQL> select * from product;PRODUCT_ID PRODUCTDESC
    ---------- -----------
    P00008     A产品
    P00004     B产品
    P00006     C产品
    P00005     F产品
    P00007     Z产品
    P00009     G产品
    P00003     T产品
     
    7 rows selected
     
    SQL> select * from sales;
     
    PRODUCT_ID
    ----------------------------------
    P00008,P00004,P00006,P00005,P00007
    P00003,P00004,P00007,P00008,P00009
     
    SQL> SELECT s.product_id, wm_concat(p.productdesc) productdesc
      2    FROM product p, sales s
      3   WHERE instr(s.product_id, p.product_id) > 0
      4   GROUP BY s.product_id;
     
    PRODUCT_ID                         PRODUCTDESC
    ---------------------------------- --------------------------------
    P00003,P00004,P00007,P00008,P00009 A产品,B产品,Z产品,T产品,G产品
    P00008,P00004,P00006,P00005,P00007 A产品,B产品,C产品,Z产品,F产品
     
    SQL> --有点小缺陷,就是位置顺序不对应
      

  2.   

    问下  wm_concat 是什么? 我这边执行报错?
      

  3.   

    --10g以下版本用这个
    SELECT product_id, ltrim(MAX(sys_connect_by_path(productdesc, ',')), ',')
      FROM (SELECT s.product_id,
                   p.productdesc,
                   row_number() over(PARTITION BY s.product_id ORDER BY p.productdesc) rn
              FROM product p, sales s
             WHERE instr(s.product_id, p.product_id) > 0)
     START WITH rn = 1
    CONNECT BY PRIOR rn = rn - 1
           AND PRIOR product_id = product_id
     GROUP BY product_id;