如何在同一行中多次获取记录,直到oracle中的列为空

时间:2014-09-05 05:34:55

标签: oracle

我需要一个以下问题的解决方案来检索oracle中的记录

表:员工

EMPID  EMPNAME COMPANY1 COMPANY2 COMPANY3 COMPANY4 
111      AAA    TCS
222      BBB    CTS      WIPRO   
333      CCC    CGI      INFY     TECHM    GOOGLE

我的结果集应该是这样的:

111 AAA TCS
222 BBB CTS
222 BBB WIPRO
333 CCC CGI
333 CCC INFY
333 CCC TECHM
333 CCC GOOGLE

请帮助解决此问题。

3 个答案:

答案 0 :(得分:1)

如果您使用的是Oracle 11g +,请使用:

with tab(EMPID,EMPNAME,COMPANY1,COMPANY2,COMPANY3,COMPANY4) as (
  select 111, 'AAA', 'TCS', null, null, null from dual union all
  select 222, 'BBB', 'CTS', 'WIPRO', null, null from dual union all
  select 333, 'CCC', 'CGI', 'INFY', 'TECHM', 'GOOGLE' from dual
  )
----------------------
--- End of data
----------------------
select empid, empname, companies 
from tab
unpivot (companies for company in (COMPANY1, COMPANY2, COMPANY3, COMPANY4));

对于旧版本,请使用:

with tab(EMPID,EMPNAME,COMPANY1,COMPANY2,COMPANY3,COMPANY4) as (
  select 111, 'AAA', 'TCS', null, null, null from dual union all
  select 222, 'BBB', 'CTS', 'WIPRO', null, null from dual union all
  select 333, 'CCC', 'CGI', 'INFY', 'TECHM', 'GOOGLE' from dual
  ),
----------------------
--- End of data
----------------------
table1 as (SELECT EMPID,
                  EMPNAME,
                  DECODE(rown, 1, COMPANY1,
                               2, COMPANY2,
                               3, COMPANY3,
                               4, COMPANY4,
                              'N/A') AS companies
             FROM tab,
                  (SELECT level AS rown 
                     FROM dual 
                  CONNECT BY level <= 4))
select * 
  from table1 
 where companies is not null
 order by 1;

两种情况下的输出都是:

| EMPID | EMPNAME | COMPANIES |
|-------|---------|-----------|
|   111 |     AAA |       TCS |
|   222 |     BBB |       CTS |
|   222 |     BBB |     WIPRO |
|   333 |     CCC |    GOOGLE |
|   333 |     CCC |      INFY |
|   333 |     CCC |     TECHM |
|   333 |     CCC |       CGI |

答案 1 :(得分:0)

select EMPID, EMPNAME, COMPANY1
  from EMPLOYEE
 where COMPANY1 is not null
union
select EMPID, EMPNAME, COMPANY2
  from EMPLOYEE
 where COMPANY2 is not null
union
select EMPID, EMPNAME, COMPANY3
  from EMPLOYEE
 where COMPANY3 is not null
union
select EMPID, EMPNAME, COMPANY4
  from EMPLOYEE
 where COMPANY4 is not null

答案 2 :(得分:0)

编写此查询的有趣部分是您需要确切知道有多少companyX列。查询联合在一起的列数越多。

我想稍微修改JoshL的答案并添加订购部分:

SELECT empid,
       empname,
       company1 AS company_name,
       1 AS company_number
  FROM employee
 WHERE company1 IS NOT NULL
UNION ALL
SELECT empid,
       empname,
       company2 AS company_name,
       2 AS company_number
  FROM employee
 WHERE company2 IS NOT NULL
UNION ALL
SELECT empid,
       empname,
       company3 AS company_name,
       3 AS company_number
  FROM employee
 WHERE company3 IS NOT NULL
UNION ALL
SELECT empid,
       empname,
       company4 AS company_name,
       4 AS company_number
  FROM employee
 WHERE company4 IS NOT NULL
ORDER BY empid, company_number;