如何在Oracle中使用子查询?

如何在Oracle中使用子查询?,oracle,stored-procedures,syntax,plsql,sys-refcursor,Oracle,Stored Procedures,Syntax,Plsql,Sys Refcursor,我有下表: 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 ... 我要做的是匹配ID并表示如下: date1 |

我有下表:

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
 ...
我要做的是匹配ID并表示如下:

 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;

我做错了什么

这里有两种选择:

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

以下是两个备选方案:

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

您还可以使用Oracle中提供的pivot函数

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 |

您还可以使用Oracle中提供的pivot函数

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 |

您想要的是加入而不是全部联合。您想要的是加入而不是全部联合。如何使用
to_char(date,'MM/DD/yyyyy HH24:MI:SS')
显示日期您已经回答了自己的问题?您只需将
的“date”部分替换为_char(date
和需要转换为该格式的任何日期列(或变量)。例如,在我上面的查询中,您可以将
t1.dt date1
更改为
改为_char(t1.dt,'MM/DD/YYYY HH24:MI:SS')date1
当我这样做时:
从表1中选择t1.dt date1,t1.name name name 1,t2.dt date2,t2.name name name 2,t1.id从表1左侧外部连接表1 t2打开(t1.id=t2.id和t1.name='abc'和t2.name='def'),其中t1.date1介于到日期('2015年6月13日13:00:00,'DD-MON-yyyyy24:MI:SS')和到日期之间(2015年6月13日13:00:00,’DD-MON-yyyyyyyh24:MI:SS)按日期订购;
我似乎没有收到记录。我正在做的事情有什么问题吗?我还将
t1.dt date1
更改为
改为_char(t1.dt,'MM/DD/yyyyyyyh24:MI:SS'))date1
如图所示。您提供的示例数据仅指定了日期,因此时间元素将默认为午夜-即2015年6月13日00:00:00。这是否有助于解释为什么假设您使用相同的示例数据,您看不到任何结果?我如何使用
to_char(date,'MM/DD/yyyyy HH24:MI:SS')显示日期
您已经回答了您自己的问题吗?您只需将
中的“日期”部分替换为_char(date
,使用需要转换为该格式的任何日期列(或变量)。例如,在我上面的查询中,您可以将
t1.dt date1
更改为
为_char(t1.dt,'MM/DD/yyyyy h24:MI:SS'))date1
当我这样做时:
从表1中选择t1.dt date1,t1.name name name 1,t2.dt date2,t2.name name name 2,t1.id从表1左侧外部连接表1 t2打开(t1.id=t2.id和t1.name='abc'和t2.name='def'),其中t1.date1介于到日期('2015年6月13日13:00:00,'DD-MON-yyyyy24:MI:SS')和到日期之间(2015年6月13日13:00:00,’DD-MON-yyyyyyyh24:MI:SS)按日期订购;
我似乎没有收到记录。我正在做的事情有什么问题吗?我还将
t1.dt date1
更改为
改为_char(t1.dt,'MM/DD/yyyyyyyh24:MI:SS'))date1
如图所示。您提供的样本数据只指定了日期,因此时间元素将默认为午夜-即2015年6月13日00:00:00。这是否有助于解释为什么您没有看到任何结果,假设您使用的是相同的样本数据?