table有两个字段code、name
--------------------------
---code--------------name----------
--10000--------------小张----------
--20000------------小李,小陈-------
--30000-----------小王,小周,小米---code字段是数字,name字段是名字,有可能是一个或多个,多个的时候用逗号分隔。
现在要的查询结果是:如果name有多个的话,分成多条记录。
比如按上面的数据,结果就是:
10000---小张
20000---小李
20000---小陈
30000---小王
30000---小周
30000---小米
查出这样的六条数据来,sql该怎么写呢,数据库是oracle

解决方案 »

  1.   

    给个思路:自己在调整一下WITH n AS (SELECT '30000' AS  a,',小王,小周,小米,' b FROM dual
               )
    SELECT a,SUBSTR(b, SP, EP - SP) STR
      FROM (SELECT  a,
                    b,
                   INSTR(b, ',', 1, ROWNUM) + 1 SP,
                   INSTR(b, ',', 1, ROWNUM + 1) EP
              FROM n
            CONNECT BY ROWNUM < 100)
     WHERE EP > 0
      

  2.   

    with tt as (
      select 10000 code,'小张'           name from dual union all
      select 20000 code,'小李,小陈'      name from dual union all
      select 30000 code,'小王,小周,小米' name from dual)
    SELECT code,
           substr(NAME,
                  instr(NAME, ',', 1, lv) + 1,
                  instr(NAME, ',', 1, lv + 1) - instr(NAME, ',', 1, lv) - 1) NAME
      FROM (SELECT DISTINCT LEVEL lv, code, ',' || NAME || ',' NAME
              FROM tt
            CONNECT BY LEVEL <= length(NAME) - length(REPLACE(NAME, ',')) + 1)
     ORDER BY code;