21

有没有办法在 Oracle 11g 中给子查询一个别名,如:

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

4 回答 4

29

您可以使用 CTE(公用表表达式)又名 WITH 子句(即 Oracle 的子查询因子)为查询指定名称或别名:

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;
于 2010-06-17T04:49:52.343 回答
7

我没有要测试的 Oracle 实例,但您发布的内容应该是有效的 ANSI-89 JOIN 语法。这是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
于 2010-06-16T23:40:02.673 回答
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;

如果 Oracle 重写查询以使计划保持不变,我不会感到惊讶。

于 2010-06-17T01:21:00.693 回答
0

在 SQL 标准中,您可以通过这种方式为子查询定义别名

SELECT Temp.patente, Temp.SalarioProm
FROM ( SELECT A.aidaid, A.patente AS Patente,
AVG (E.esalario) AS SalarioProm
FROM Aircraft A, Certified C, Employees E
WHERE A.aid = C.aid
AND C. eid = E.eid
AND A.rangocrucero > 1000
GROUP BY A.aid, A.patente ) AS Temp

其中 Temp 是子查询的别名

在 Oracle 中,您可以使用 WITH 子句,尤其是在子查询复杂且使用大量临时空间的情况下。

在 Oracle 中,以下语法可以正常工作

SELECT Temp.patente, Temp.SalarioProm
FROM ( SELECT A.aidaid, A.patente AS Patente,
AVG (E.esalario) AS SalarioProm
FROM Aircraft A, Certified C, Employees E
WHERE A.aid = C.aid
AND C. eid = E.eid
AND A.rangocrucero > 1000
GROUP BY A.aid, A.patente ) Temp

于 2021-11-01T13:00:21.183 回答