从单行的多列输出多行

时间:2012-08-20 03:15:30

标签: sql oracle

我有一张未正常化的表格,我无法更改表格的结构。该表包含6个用于保存首选项的列,即preference_num1 ... preference_num6。我想从表中提取数据,以便看起来有6行,其中一个首选项在一行中。

为清楚起见,输出应为Id,semester_start,year_start,email,preference_num。并且,每行将分为6行。

Name                    Null     Type          
----------------------- -------- ------------- 
ID                               number (primary key)
YEAR_START                       NUMBER        
SEMESTER_START                   VARCHAR2(8)   
EMAIL                            VARCHAR2(100) 
PREFERENCE_NUM_1                 VARCHAR2(1)   
PREF_INSTITUTION_NAME_1          VARCHAR2(100) 
PREF_INSTITUTION_CODE_1          VARCHAR2(15)  
PREF_COURSE_TITLE_1              VARCHAR2(100) 
COURSE_CODE_1                    VARCHAR2(15)  
OFFERING_LABLE_1                 VARCHAR2(15)  
PREFERENCE_NUM_2                 VARCHAR2(1)   
PREF_INSTITUTION_NAME_2          VARCHAR2(100) 
PREF_INSTITUTION_CODE_2          VARCHAR2(15)  
PREF_COURSE_TITLE_2              VARCHAR2(100) 
COURSE_CODE_2                    VARCHAR2(15)  
OFFERING_LABLE_2                 VARCHAR2(15)  
PREFERENCE_NUM_3                 VARCHAR2(1)   
PREF_INSTITUTION_NAME_3          VARCHAR2(100) 
PREF_INSTITUTION_CODE_3          VARCHAR2(15)  
PREF_COURSE_TITLE_3              VARCHAR2(100) 
COURSE_CODE_3                    VARCHAR2(15)  
OFFERING_LABLE_3                 VARCHAR2(15)  
PREFERENCE_NUM_4                 VARCHAR2(1)   
PREF_INSTITUTION_NAME_4          VARCHAR2(100) 
PREF_INSTITUTION_CODE_4          VARCHAR2(15)  
PREF_COURSE_TITLE_4              VARCHAR2(100) 
COURSE_CODE_4                    VARCHAR2(15)  
OFFERING_LABLE_4                 VARCHAR2(15)  
PREFERENCE_NUM_5                 VARCHAR2(1)   
PREF_INSTITUTION_NAME_5          VARCHAR2(100) 
PREF_INSTITUTION_CODE_5          VARCHAR2(15)  
PREF_COURSE_TITLE_5              VARCHAR2(100) 
COURSE_CODE_5                    VARCHAR2(15)  
OFFERING_LABLE_5                 VARCHAR2(15)  
PREFERENCE_NUM_6                 VARCHAR2(1)   
PREF_INSTITUTION_NAME_6          VARCHAR2(100) 
PREF_INSTITUTION_CODE_6          VARCHAR2(15)  
PREF_COURSE_TITLE_6              VARCHAR2(100) 
COURSE_CODE_6                    VARCHAR2(15)  
OFFERING_LABLE_6                 VARCHAR2(15)  
DATA_EXTRACTION_DATE             DATE          
OFFER_DATE_1                     DATE          
OFFER_RESPONSE_1                 VARCHAR2(20)  
FINAL_OFFER_RESPONSE_1           VARCHAR2(20)  
OFFER_DATE_2                     DATE          
OFFER_RESPONSE_2                 VARCHAR2(20)  
FINAL_OFFER_RESPONSE_2           VARCHAR2(20)  
OFFER_DATE_3                     DATE          
OFFER_RESPONSE_3                 VARCHAR2(20)  
FINAL_OFFER_RESPONSE_3           VARCHAR2(20)  
OFFER_DATE_4                     DATE          
OFFER_RESPONSE_4                 VARCHAR2(20)  
FINAL_OFFER_RESPONSE_4           VARCHAR2(20)  
OFFER_DATE_5                     DATE          
OFFER_RESPONSE_5                 VARCHAR2(20)  
FINAL_OFFER_RESPONSE_5           VARCHAR2(20)  
OFFER_DATE_6                     DATE          
OFFER_RESPONSE_6                 VARCHAR2(20)  
FINAL_OFFER_RESPONSE_6           VARCHAR2(20)  

由于

1 个答案:

答案 0 :(得分:3)

如果您搜索UNPIVOT技术或“oracle列到行”,您可能会找到更多相关信息。

执行此操作的一种方法如下所示,如果您输入一个(索引)ID,则该方法很有效。我只获得了3个偏好,以保持示例简单。

这是基本的想法。

select id, sem_start, year_start, pref_num1 from table_1 where id = input_id
union all 
select id, sem_start, year_start, pref_num2 from table_1 where id = input_id
union all
select id, sem_start, year_start, pref_num3 from table_1 where id = input_id

您应该使用此查询,这样性能会更高,因为我们只通过id查询一次。

with t1 as
(select * from table_1 where id = id1)
select id, sem_start, year_start, pref_num1 from t1
union all 
select id, sem_start, year_start, pref_num2 from t1
union all
select id, sem_start, year_start, pref_num3 from t1