如何在oracle嵌套查询中引用别名?

时间:2012-05-16 10:17:10

标签: sql oracle alias

我有几个这样的嵌套查询:

(SELECT "impartidas"."idUsuarioProf"
   FROM "impartidas"
   WHERE "impartidas"."periodo" = "periodoPlanGrado"."periodo" and
         "impartidas"."idMateria" = "materiasPlan"."idMateria") T,
(SELECT "usuarios"."apellidoPaterno" || ' , ' || "usuarios"."nombres"
   FROM "usuarios"
   WHERE "usuarios"."idUsuario" = 36) as "nomprofesor" 

第一个输出名为teacher ID的列中的T

我需要在第二个查询中更改什么,只是为了代替36,它使用列别名T中显示的值?

简而言之,我需要根据第一个查询的输出ID值执行第二个查询。

2 个答案:

答案 0 :(得分:2)

r在没有任何背景的情况下,很难理解为什么你采取这种错综复杂的方法。显而易见的方法只是一个简单的连接:

SELECT "impartidas"."idUsuarioProf"    
 ,  "usuarios"."apellidoPaterno" || ' , ' || "usuarios"."nombres" "nomprofesor" 
FROM "impartidas"   
      , "periodoPlanGrado"
      , "materiasPlan"
      ,  "usuarios"
 WHERE "impartidas"."periodo" = "periodoPlanGrado"."periodo" 
and          "impartidas"."idMateria" = "materiasPlan"."idMateria") T
and "usuarios"."idUsuario" = "impartidas"."idUsuarioProf" 
/

但是如果你真的需要内联,那么你需要在外部进行加入,如下所示:

select P."nomprofesor" 
from 
    (SELECT "impartidas"."idUsuarioProf"
      FROM "impartidas"   
              , "periodoPlanGrado"
              , "materiasPlan"               
     WHERE "impartidas"."periodo" = "periodoPlanGrado"."periodo" 
      and      "impartidas"."idMateria" = "materiasPlan"."idMateria") T, 
    (SELECT "usuarios"."apellidoPaterno" || ' , ' || "usuarios"."nombres"  as "nomprofesor" 
            , "usuarios"."idUsuario"
      FROM "usuarios"       ) P     
WHERE P."idUsuario" = T."idUsuarioProf"

请注意,您需要在每个子查询的投影中包含所有连接列。因为,您需要使用别名来引用外部查询中的派生列。

答案 1 :(得分:0)

这个怎么样:

SELECT "usuarios"."apellidoPaterno" || ' , ' || "usuarios"."nombres" AS "nomprofesor"
FROM   "usuarios"
WHERE  "usuarios"."idUsuario" = (
           SELECT "impartidas"."idUsuarioProf"
           FROM   "impartidas", "periodoPlanGrando", "materiasPlan"
           WHERE  "impartidas"."periodo" = "periodoPlanGrado"."periodo" 
              AND "impartidas"."idMateria" = "materiasPlan"."idMateria"
        )

或者

SELECT "usuarios"."apellidoPaterno" || ' , ' || "usuarios"."nombres" AS "nomprofesor"
FROM   "usuarios"
WHERE  "usuarios"."idUsuario" IN (
           SELECT "impartidas"."idUsuarioProf"
           FROM   "impartidas", "periodoPlanGrando", "materiasPlan"
           WHERE  "impartidas"."periodo" = "periodoPlanGrado"."periodo" 
              AND "impartidas"."idMateria" = "materiasPlan"."idMateria"
        )

如果子查询可能生成多行(我不知道架构,而我的西班牙语不是很好(IS NULL)来理解"impartidas"表中的内容。)

出于代码维护和可读性的原因,我会写这个:

SELECT u.apellidoPaterno || ' , ' || u.nombres AS nomprofesor
FROM   usuarios u
WHERE  u.idUsuario = (
           SELECT i.idUsuarioProf
           FROM   impartidas i
                  INNER JOIN periodoPlanGrando p USING ( periodo )
                  INNER JOIN materiasPlan m      USING ( idMateria )
        -- WHERE (other condifitions)
        )

甚至是这样:

SELECT u.apellido_paterno || ' , ' || u.nombres AS nom_profesor
FROM   usuarios u
WHERE  u.id_usuario = (
           SELECT i.id_usuario_prof
           FROM   impartidas i
                  INNER JOIN periodo_plan_grado p USING ( periodo )
                  INNER JOIN materias_plan m      USING ( id_materia )
        -- WHERE (other condifitions)
        )

但这需要将表和列名称的折射更多地称为Oracle标识符。