Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-09-2004
pigu pigu is offline
Miembro
 
Registrado: jul 2004
Posts: 12
Poder: 0
pigu Va por buen camino
Consulta SQL

Hola Amigos:

Gracias por estar siempre de ese lado para ayudarnos con nuestras inquietudes.
Mi duda es por qué no funciona la siguiente consulta SQL:
Antes les comento que tengo 2 tablas;
Materias
Correlativas

En Materias tengo los campos codigo,nombre,etc...
En Correlativas tengo los campos codigo1,correlativa.
Como ustedes sabran las relaciones entre las 2 tablas estan dadas entre los campos codigo de la tabla Materias y los campos codigo1 y correlativas.
Relacion 1 a muchos...
Codigo es primary key de Materias y codigo1 y correlativas son primary key de correlativas...
Lo que no logro obtener con esta consulta...
SELECT materias.nombre
FROM materias inner join correlativas on
materias.codigo = correlativas.codigo1
WHERE materia = (select codigo
FROM
materias
WHERE nombre = 'Programcion 2')
...es saber que materias necesito tener aprobadas para cursar Programacion 2

Lo probe en Interbase y no funciona...

Desde ya, muchas gracias por su ayuda
Responder Con Cita
  #2  
Antiguo 23-09-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Si entiendo bien (es que el término correlativa no me es familiar) la tabla correlativas almacena las materias que deben ser aprobadas para determinado curso. Así, si por ejemplo

materias
Código:
codigo |      nombre
-------+-----------------
  ...  |       ... 
-------+-----------------
   84  | "Programación 2"
-------+-----------------
  ...  |       ...  
-------+-----------------
La tabla correlativas podía contener las entradas

Código:
codigo1 | correlativa
--------+------------
   84   |     75
--------+------------
   84   |     63
--------+------------
   84   |     12
--------+------------
indicando que las materias con códigos 75, 63 y 12 deben ser aprobadas para poder cursar "Programación 2".

¿Es así?

Bueno, de ser así, fíjate que lo que tú quieres listar no son materias sino correlativas, esto es, no estás listando registros de la tabla materias sino de la tabla correlativas, de manera que una primera aproximación sería:

Código SQL [-]
select
  correlativas.correlativa
from correlativas
where
  correlativas.codigo1 = 84

Pero me parece que tú quieres especificar la materia en el where mediante su nombre y no su código. Ahí es donde entraría el join:

Código SQL [-]
select
  correlativas.correlativa
from correlativas
left join materias
  on materias.codigo = correlativas.codigo1
where
  materias.nombre = "Programación 2"

Y ya para que te presente los nombres correspondietes a las correlativas listadas en lugar de su código simplemente pones:

Código SQL [-]
select
  materias.nombre
from correlativas
left join materias
  on materias.codigo = correlativas.codigo1
where
  materias.nombre = "Programación 2"

En fin, te lo estoy diciendo conforme lo voy pensando y no lo he comprobado pero puedes intentarlo.

// Saludos
Responder Con Cita
  #3  
Antiguo 24-09-2004
pigu pigu is offline
Miembro
 
Registrado: jul 2004
Posts: 12
Poder: 0
pigu Va por buen camino
Hola Roman:

En verdad te agradezco tu ayuda, en serio.
Te comento, la consulta sql nº1:
Código SQL [-]
select
correlativas.correlativa
from correlativas
where
correlativas.codigo1 = 84
funciona, es decir, me devuelve los codigos de las materias que son correlativas con el codigo de materia ingresado.
La segunda...
Código SQL [-]
select
correlativas.correlativa
from correlativas
left join materias
on materias.codigo = correlativas.codigo1
where
materias.nombre = "Programación 2"
tambien funciona de maravillas...

pero la tercera...
me devuelve como resultado el mismo nombre de la materia ingresada como parametro de busqueda repetida 2 veces...

Como te comentaba en la pregunta inicial..
probé con la siguiente consulta sql...:
esta es diferente a la primera...
Código SQL [-]
 
select materias.nom_materia 
from materias 
where materias.cod_materia 
in (select correlativas.materia 
from correlativas 
where correlativas.materia = 
(select cod_materia 
from materias 
where materias.nom_materia = 'Programacion 2'))

Será que no soporta subconsultas anidadas interbase???

Desde ya muchas gracias por tu ayuda

Última edición por pigu fecha: 24-09-2004 a las 02:46:30.
Responder Con Cita
  #4  
Antiguo 24-09-2004
pigu pigu is offline
Miembro
 
Registrado: jul 2004
Posts: 12
Poder: 0
pigu Va por buen camino
Hola Roman:

Encontre la falla en la consulta que habia ejecutado en un principio....

es decir, me habia equivocado en la subconsulta 1:
Código SQL [-]
(select correlativas.materia 
from correlativas 
where correlativas.materia

deberia haber puesto...
Código SQL [-]
(select correlativas.correlativa 
from correlativas 
where correlativas.materia

La consulta completa es:
Código SQL [-]
select materias.nom_materia
from materias
where materias.cod_materia
in (select correlativas.correlativa
from correlativas
where correlativas.materia =
(select cod_materia
from materias
where materias.nom_materia = 'Programacion 2'))

Gracias por el envion que me diste para resolver el problema...

Saludos cordiales desde Argentina
Responder Con Cita
  #5  
Antiguo 24-09-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
No conozco interbase pero seguramente que sí acepta subconsultas anidadas. Sólo que en este caso no es necesario, nada más hay que hacer una modificación. Necesitas hacer un segundo join a la tabla materias:

Código SQL [-]
select
  mat.nombre
from correlativas
left join materias
  on materias.codigo = correlativas.codigo1
left join materias mat
  on materias.codigo = correlativas.correlativa
where
  materias.nombre = "Programación 2"

// Saludos
Responder Con Cita
  #6  
Antiguo 24-09-2004
pigu pigu is offline
Miembro
 
Registrado: jul 2004
Posts: 12
Poder: 0
pigu Va por buen camino
Gracias Roman por tu segunda respuesta...
parece que me adelante a tu contestacion...

Saludos
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 13:08:25.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi