首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sql加载程序从一行加载多行

sql加载程序从一行加载多行
EN

Stack Overflow用户
提问于 2013-12-02 16:14:01
回答 1查看 1K关注 0票数 1

我面临着用sql加载程序加载文件的问题。

这就是我的输入文件的样子:

代码语言:javascript
复制
#ID; CARD_NUMBER;USERNAME  
1;86730975,86536522,86793501;JOHN SMITH  
2;89734562;MICHAEL ABOT  
3;87903546,87265390;JAMES ALBERT  

我在装货后想要做的是:

代码语言:javascript
复制
#Table data
1;86730975;JOHN SMITH  
1;86536522;JOHN SMITH  
1;86793501;JOHN SMITH  
2;89734562;MICHAEL ABOT  
3;87903546;JAMES ALBERT  
3;87265390;JAMES ALBERT  

在使用Sql之前,我做了类似的事情,但是我找不到源代码。所以如果有人能帮忙的话,我会很高兴的。

我是这个论坛的新手,我不知道如何找到所有与我的用户名相关的帖子,如果有人能帮忙的话,我会很感激的。

EN

回答 1

Stack Overflow用户

发布于 2013-12-02 17:46:32

您可以使用外部表。对我个人来说,这将是一个更方便的方式来完成它:

  1. 在Oracle中创建一个指向服务器上文件的确切位置的目录。 SQL>创建或替换目录ff1为'c:\';创建目录
  2. 创建与此类似的外部表: SQL> created t1( 2 t1_id number,3 card_no varchar2(4,000),4 user_name varchar2(4,000)5)6组织外部(7类型oracle_loader 8默认目录ff1 9访问参数( 10条记录由换行符11字段分隔,由';‘12 ) 13 location('input.dat') --<--文件名14 )拒绝无限限制,15;表创建。

之后,您可以查询外部表,并使用任意(其中有许多)方法来拆分逗号分隔的字符串。在这种情况下,它将是card_number的值。例如:

这是实际数据:

代码语言:javascript
复制
SQL> column card_no format a40;
SQL> column user_name format a17;

SQL> select * from t1;

     T1_ID CARD_NO                                  USER_NAME
---------- ---------------------------------------- -----------------
         1 86730975,86536522,86793501               JOHN SMITH
         2 89734562                                 MICHAEL ABOT
         3 87903546,87265390                        JAMES ALBERT

3 rows selected.

实际数据的转换版本:

代码语言:javascript
复制
SQL> column card_no format 9999999999;

SQL> with ocrs(ocr) as(
  2    select level
  3      from ( select max(regexp_count(card_no, '[^,]+')) as mx
  4               from t1 ) s
  5     connect by level <= s.mx
  6  )
  7  select *
  8    from (select t.t1_id
  9               , to_number(regexp_substr(t.card_no, '[^,]+', 
 10                                         1, o.ocr)) as card_no
 11               , t.user_name
 12            from t1 t
 13           cross join ocrs o ) w
 14    where w.card_no is not null
 15   order by w.t1_id;

结果:

代码语言:javascript
复制
      T1_ID     CARD_NO USER_NAME
----------- ----------- -----------------
          1    86730975 JOHN SMITH
          1    86793501 JOHN SMITH
          1    86536522 JOHN SMITH
          2    89734562 MICHAEL ABOT
          3    87265390 JAMES ALBERT
          3    87903546 JAMES ALBERT

6 rows selected.

这样,您就可以使用简单的insert语句结合上面的查询将新的、转换的数据插入到另一个表中。

代码语言:javascript
复制
 insert into another_table(id, card_number, user_name)
    with ocrs(ocr) as(
      select level
    .....  
    /* the above query */
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20332728

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档