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

2 番目のクエリで何を変更する必要があります36T?

IDつまり、最初のクエリの出力値に基づいて、2 番目のクエリを実行する必要があります。

4

2 に答える 2

2

コンテキストがまったくない場合、なぜそのような複雑なアプローチを取るのかを理解するのは困難です。明らかなアプローチは単純な結合です。

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 に答える