2014-09-05 1 views
0

мне нужно решение следующей задачи для извлечения записей в оракулеКак извлечь записи несколько раз из одной строки до столбца равен нуль в оракуле

Таблица: СОТРУДНИК

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
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 
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; 
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 |