我需要一个以下问题的解决方案来检索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
请帮助解决此问题。
答案 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;