1

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

(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值执行第二个查询。

4

2 回答 2

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"

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

于 2012-05-16T12:20:17.123 回答
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 标识符。

于 2012-05-17T09:11:25.220 回答