2010-06-16 52 views
13

有没有办法让在Oracle 11g的子查询像一个别名:有没有办法在Oracle 11g SQL中为子查询提供一个别名?

select * 
from 
    (select client_ref_id, request from some_table where message_type = 1) abc, 
    (select client_ref_id, response from some_table where message_type = 2) defg 
where 
    abc.client_ref_id = def.client_ref_id; 

否则,有没有办法加入基础上,client_ref_id两个子查询。我意识到有一个自我连接,但在自我连接上运行的数据库可能需要5分钟才能完成(在我正在运行的实际查询中有一些额外的逻辑,但我确定了自连接是什么造成这个问题)。单独的子查询只需要几秒钟即可完成。自连接查询看起来像:

select st.request, st1.request 
from 
    some_table st, some_table st1 
where 
    st.client_ref_id = st1.client_ref_id; 
+0

只是好奇,接受的答案表现如何? – DCookie 2010-06-17 21:23:15

+1

你还没有想出它是自联接。制作表格,索引和统计数据的完全相同的副本,并查看是否获得相同的时间。更好的问题是,“帮助我调整这个查询”并发布完整查询和解释计划。 – 2010-06-17 22:22:08

回答

16
 
WITH abc as (select client_ref_id, request from some_table where message_type = 1) 
select * 
from abc 
    inner join 
    (select client_ref_id, response from some_table where message_type = 2) defg 
on abc.client_ref_id = def.client_ref_id; 
+0

“WITH abc as(select ...)”部分的技术术语是什么?如果有人想研究它的能力。 – SeaBass 2015-05-29 15:23:20

+2

@SeaBass:常用表格表达式,通常缩写为CTE(也常常用作名称/别名,尽管这次我没有这样做)。请注意,这两个“表格”都可以作为CTE的一部分完成,我只想显示两个选项,一个是另一个,另一个是另一个。 – jmoreno 2015-05-29 15:25:21

5

我没有一个Oracle实例来进行测试,但你贴什么应该是有效的ANSI-89连接语法。这是在ANSI-92:

SELECT * 
    FROM (SELECT client_ref_id, request 
      FROM SOME_TABLE 
     WHERE message_type = 1) abc 
    JOIN (SELECT client_ref_id, request 
      FROM SOME_TABLE 
     WHERE message_type = 1) defg ON defg.client_ref_id = abc.client_ref_id 
3

您的查询应该没问题。

另一种方法是:

select abc.client_ref_id, abc.request, def.response 
from some_table abc, 
     some_table def 
where abc.client_ref_id = def.client_ref_id 
and abc.message_type = 1 
and def.message_type = 2; 

,我不会感到惊讶,如果甲骨文改写了查询,以使该计划将是相同的反正。

+0

这个解决方案需要很长时间才能完成我正在使用的数据库。语句'abc.client_ref_id = def.client_ref_id'使查询从几秒钟过去超过一个小时以完成。 – 2010-06-17 15:33:50

+0

你必须非常小心时机。你在谈论最后一排时机吗?或只是第一排?某些查询计划可以非常快速地生成1行(一秒),但需要一年时间才能生成最后一行。而其他人会在一分钟内得到最后一行。 – 2010-06-17 21:57:21

+0

@Matt,发布查询计划 - 当我们不知道是什么导致性能问题时,不适合使用SQL。 – 2010-06-18 00:53:45

相关问题