Oracle PL SQL平面文件到表加载更改格式

时间:2013-11-21 08:38:10

标签: sql oracle plsql

我有一个包含问题的源平面文件(q1,q2,q3,..,qn)&人(p1,p2,..,pm)&他们的回答(r11,r12)采用以下格式。这个问题&人数不固定

源文件

person  q(1)    q(2)    q(3)    ..  q(n)
p(1)    r(11)   r(12)   r(13)   ..  r(1n)
p(2)    r(21)   r(22)   r(23)   ..  r(2n)
..                  
p(m)    r(m1)   r(m2)   r(m3)       r(mn)

我想以下列格式将该数据存储在我的oracle目标表中。如何使用sql / pl sql以最佳方式执行此操作。

目的地表

person  question    response
p(1)    q(1)    r(11)
p(1)    q(2)    r(12)
p(1)    q(3)    r(13)
p(1)    q(n)    r(1n)
p(2)    q(1)    r(21)
p(2)    q(2)    r(22)
p(2)    q(3)    r(23)
p(2)    q(n)    r(2n)
p(m)    q(1)    r(m1)
p(m)    q(2)    r(m2)
p(m)    q(3)    r(m3)
p(m)    q(n)    r(mn)

2 个答案:

答案 0 :(得分:1)

简而言之,您需要的是这个SQL

SELECT
      *
FROM
      YOUR_TABLE UNPIVOT (FIRST_COLUMN FOR WHATEVER_NAME_YOU WANT IN (COLUMN2_MATRIX, COLUMN3_MATRIX, COLUMN4_MATRIX ... COLUMNN_MATRIX ))
ORDER BY
      FIRST_COLUMN;

解释如下: 使用您选择的任何实用程序按如下方式加载数据。

WITH PIVOTED_DATA
    AS (SELECT
             'p1' AS COL_VAL,
             'r11' AS Q1,
             'r12' AS Q2,
             'r13' AS Q3
        FROM
             DUAL
        UNION ALL
        SELECT
             'p2' AS COL_VAL,
             'r21' AS Q1,
             'r22' AS Q2,
             'r23' AS Q3
        FROM
             DUAL
        UNION ALL
        SELECT
             'p3' AS COL_VAL,
             'r31' AS Q1,
             'r32' AS Q2,
             'r33' AS Q3
        FROM
             DUAL)
SELECT
      *
FROM
      PIVOTED_DATA;

加载后应该看起来像这样

COL_VAL Q1  Q2  Q3 
------- --- --- ---
p1      r11 r12 r13
p2      r21 r22 r23
p3      r31 r32 r33

3 rows selected.

然后使用Oracle UNPIVOT(仅在11G之后和之后可用)

WITH PIVOTED_DATA
    AS (SELECT
             'p1' AS COL_VAL,
             'r11' AS Q1,
             'r12' AS Q2,
             'r13' AS Q3
        FROM
             DUAL
        UNION ALL
        SELECT
             'p2' AS COL_VAL,
             'r21' AS Q1,
             'r22' AS Q2,
             'r23' AS Q3
        FROM
             DUAL
        UNION ALL
        SELECT
             'p3' AS COL_VAL,
             'r31' AS Q1,
             'r32' AS Q2,
             'r33' AS Q3
        FROM
             DUAL)
SELECT
      *
FROM
      PIVOTED_DATA UNPIVOT (COL1 FOR DATASET IN (Q1, Q2, Q3))
ORDER BY
      COL_VAL;

哪个会为你提供

COL_VAL DATASET COL1
------- ------- ----
p1      Q1      r11 
p1      Q2      r12 
p1      Q3      r13 
p2      Q1      r21 
p2      Q2      r22 
p2      Q3      r23 
p3      Q1      r31 
p3      Q2      r32 
p3      Q3      r33 

9 rows selected.

答案 1 :(得分:0)

有很多选择

<强> 1。 sql loader  2.外部表  3. UTL_FILE

谷歌提供这些关键词,请自行试用。 一旦数据在oracle中,您就需要根据您的要求对其进行转换。如@realspirituals所述,检查unpivot和pivot功能。请提及下次oracle版本,以便人们可以提出适当的解决方案。 (早期版本中没有unpivot和pivot功能)

如果您在实施过程中遇到任何问题,请在此处发布。