我有一个包含问题的源平面文件(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)
答案 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功能)
如果您在实施过程中遇到任何问题,请在此处发布。