2015-07-31 4 views
1

У меня есть следующая таблица:Как использовать подзапросы в Oracle?

table1 
------------------------- 
date  | ID | name 
------------------------- 
13-jul-15 | 1 | abc 
13-jul-15 | 2 | abc 
14-jul-15 | 1 | def 
13-jul-15 | 3 | abc 
15-jul-15 | 3 | def 
... 

То, что я хочу сделать, это соответствовать идентификатору и представлять, как показано ниже:

date1  | name | date2  | name | ID 
------------------------------------------ 
13-jul-15 | abc | 14-jul-15 | def | 1 
13-jul-15 | abc |   |  | 2 
13-jul-15 | abc | 15-jul-15 | def | 3 
... 

Я использовал следующий код, но не получение результата.

CREATE PROCEDURE get_details (oresults1 OUT SYS_REFCURSOR) AS 
BEGIN 
    SELECT * 
    FROM ((SELECT date, ID FROM table1 WHERE name= "abc") T1 
      UNION ALL 
      (SELECT date, ID FROM table1 WHERE name= "def") T2 
     ) 
    WHERE T1.ID= T2.ID 
    ORDER BY ID; 
END; 

Что я сделал не так?

+2

Вы хотите присоединиться не объединение всех. –

ответ

3

Вот несколько альтернатив:

with table1 as (select to_date('13/07/2015', 'dd/mm/yyyy') dt, 1 id, 'abc' name from dual union all 
       select to_date('13/07/2015', 'dd/mm/yyyy') dt, 2 id, 'abc' name from dual union all 
       select to_date('14/07/2015', 'dd/mm/yyyy') dt, 1 id, 'def' name from dual union all 
       select to_date('13/07/2015', 'dd/mm/yyyy') dt, 3 id, 'abc' name from dual union all 
       select to_date('15/07/2015', 'dd/mm/yyyy') dt, 3 id, 'def' name from dual) 
-- end of mimicking your table1. See below for the query 
select t1.dt date1, 
     t1.name name1, 
     t2.dt date2, 
     t2.name name2, 
     t1.id 
from table1 t1 
     left outer join table1 t2 on (t1.id = t2.id and t1.name = 'abc' and t2.name = 'def') 
where t1.name = 'abc' 
order by t1.id; 

DATE1  NAME1 DATE2  NAME2   ID 
---------- ----- ---------- ----- ---------- 
13/07/2015 abc 14/07/2015 def   1 
13/07/2015 abc        2 
13/07/2015 abc 15/07/2015 def   3 

with table1 as (select to_date('13/07/2015', 'dd/mm/yyyy') dt, 1 id, 'abc' name from dual union all 
       select to_date('13/07/2015', 'dd/mm/yyyy') dt, 2 id, 'abc' name from dual union all 
       select to_date('14/07/2015', 'dd/mm/yyyy') dt, 1 id, 'def' name from dual union all 
       select to_date('13/07/2015', 'dd/mm/yyyy') dt, 3 id, 'abc' name from dual union all 
       select to_date('15/07/2015', 'dd/mm/yyyy') dt, 3 id, 'def' name from dual) 
-- end of mimicking your table1. See below for the query 
select t1.dt date1, 
     t1.name name1, 
     t2.dt date2, 
     t2.name name2, 
     t1.id 
from (select id, dt, name from table1 where name = 'abc') t1 
     left outer join (select id, dt, name from table1 where name = 'def') t2 on (t1.id = t2.id) 
where t1.name = 'abc' 
order by t1.id; 

DATE1  NAME1 DATE2  NAME2   ID 
---------- ----- ---------- ----- ---------- 
13/07/2015 abc 14/07/2015 def   1 
13/07/2015 abc        2 
13/07/2015 abc 15/07/2015 def   3 
+0

Как я могу показать дату с помощью 'to_char (date, 'MM/DD/YYYY HH24: MI: SS')' – Vidya

+0

Вы как-то ответили на свой вопрос? вы просто замените «date» часть 'to_char (date' любым столбцом (или переменной), который вам нужно преобразовать в этот формат. Например, в моих запросах вы можете изменить' t1.dt date1' на 'to_char (t1.dt, 'MM/DD/YYYY HH24: MI: SS') date1' – Boneist

+0

когда я это делаю: 'select t1.dt date1, t1.name name1, t2.dt date2, t2.name name2 , t1.id from table1 t1 left external join table1 t2 on (t1.id = t2.id и t1.name = 'abc' и t2.name = 'def') где t1.date1 между TO_DATE (' 13-Jun-2015 13:00:00 ',' DD-MON-YYYY HH24: MI: SS ') и TO_DATE (13 июня-2015 13:00:00, DD-MON-YYYY HH24: MI: SS) упорядочить по дате1; ' Кажется, что у меня нет записей. что-то не так в том, что я делаю? – Vidya

2

Вы также можете использовать функцию поворота, доступные в Oracle

WITH table_(date#, id#, name#) AS 
(SELECT to_date('13-jul-15', 'dd-mon-yy'), 1, 'abc' FROM dual UNION all 
SELECT to_date('13-jul-15', 'dd-mon-yy'), 2, 'abc' FROM dual UNION all 
SELECT to_date('14-jul-15', 'dd-mon-yy'), 1, 'def' FROM dual UNION all 
SELECT to_date('13-jul-15', 'dd-mon-yy'), 3, 'abc' FROM dual UNION all 
SELECT to_date('15-jul-15', 'dd-mon-yy'), 3, 'def' FROM dual) 
-------- 
-- End of data preparation 
-------- 
SELECT * 
    FROM table_ 
PIVOT (MIN(date#) AS date#, MIN(name#) AS NAME# FOR name# IN ('abc' AS ABC, 'def' AS DEF)); 

Выход

| ID# |    ABC_DATE# | ABC_NAME# |    DEF_DATE# | DEF_NAME# | 
|-----|------------------------|-----------|------------------------|-----------| 
| 1 | July, 13 2015 00:00:00 |  abc | July, 14 2015 00:00:00 |  def | 
| 2 | July, 13 2015 00:00:00 |  abc |      |   | 
| 3 | July, 13 2015 00:00:00 |  abc | July, 15 2015 00:00:00 |  def | 
Смежные вопросы