Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 2
Ir a la página 1, 2  Siguiente
 
SQL: Como Hacer Consultas En Varias Tablas Relacionadas.
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje SQL: Como Hacer Consultas En Varias Tablas Relacionadas. 
 
Bueno, he hecho un post, para comentar varias sentencias que se pueden usar para hacer consultas con tablas que esten relacionadas.

Se trata de un ejemplo sobre: Profesores, Materias y la relación de estos profesores con las materias que imparten

http://jsbsan.blogspot.com.es/2014/...les-tablas.html

 captura_esquema_profesores_y_materias_sql_multiples_tablas

Nota:
Se puede hacer de varias formas, yo lo he hecho con la más simple pero no es la más optima.
 




===================
Blog personal
Web: SoloGambas seleccion de articulos dedicados a Gambas
Visita el Curso de Gambas3 ¡¡¡Gratuito!!!
 
jsbsan - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: SQL: Como Hacer Consultas En Varias Tablas Relacionadas. 
 
Si señor JSBSAN vi el blog no sabia que existía esa clase de consulta con tres tablas pensaba que solo se podía usar inner join, se ve bastante interesante quizá pueda resolver mi problema, pero me tiene confundido la parte del blog http://oscarsotorrio.com/post/2010/...les-tablas.aspx abajo el muestra un inner join que dice combinación de tres tablas por lo que no sabría si en la parte de select esta metiendo los campos de dos o tres tablas le voy comentar del porque mi problema señor jsbsan.

Siguiendo un poco el tema señor JSBSAN usted dirá que yo si le hago preguntas que soy muy canzon pero me gusta su manera de explicar las cosas, quiero comentarle sobre una duda que tengo referente a una consulta sql de tres tablas relacionas de muchos muchos, estas tablas son una de llenado de profesores la segunda de materias y la tercera es auxiliar de las dos llamada profesores_materias que guarda las foráneas de las dos antes expuestas que están así:

  profesores_materias

Por lo que he revisado innumerable consultas de este tipo de relación y la consulta me ha salido asi:

Código: [Descargar] [Ocultar] [Seleccionar]
hresultado2 = conexion.hconn.Exec("SELECT  p.cedula_profesor, p.nombre, p.direccion, p.telefono, m.id_materia,m.nombre_materia From profesores_materias pm INNER JOIN profesores p On pm.fk_profesores = p.cedula_profesor INNER JOIN materias m On pm.fk_materias = m.id_materia")


Lógicamente me muestra los datos de las dos tablas que son profesores y materias que a su ves me dice cuantas materias son vistas por un profesor y viceversa, pero me sucede algo que yo también quiero ver los campos de la tabla auxiliar que los relaciona a ellos dos y lamentablemente no puedo quizá me falta mucho conocimiento al respecto, he intentado colocar un campo de la respectiva tabla profesores_materias en el select que se ve arriba pero me dice que no se puede da error!.

Ahora la pregunta es porque también me interesa ver un campo de la tabla auxiliar profesores_materias? porque alli es donde se almacenan la cantidad de materias que ve un profesor y si yo quisiera modificar o borrar la materia que ya el profesor no va a ver?

Yo se que esto parece un testamento pero no tengo como expresarlo mejor!

Pues como usted sabrá la variable hresultado2 se llena arriba con la consulta de las tres tablas listas y funciona con el código que usted me dio prefecto y mil gracias por eso señor JSBSAN pero tengo un inconveniente que al traer los registros consultados me obliga a mostrar lo que solo el select me pidio y queda asi:

Código: [Descargar] [Ocultar] [Seleccionar]
Public Sub Transporte_nombre_cedula(Data As Result)
hresul = Data
'TextBox_ide.Text = hresul["id_profesores_materias"]
TextBox_cedula.Text = hresul["cedula_profesor"]
TextBox_nombre.Text = hresul["nombre"]  
TextBox_direccion.Text = hresul["direccion"]  
TextBox_telefono.Text = hresul["telefono"]  
TextBox_ide2.Text = hresul["id_materia"]  
ComboBox_materias.Text = hresul["nombre_materia"]
End


Si observa bien me falta mostrar el TextBox_ide.Text = hresul["id_profesores_materias"] que es de la tabla auxliar profesores_materias que por el hecho de no poder traerlo no podre borrar el registro consultado, como por ejemplo al intentar borrarlo con el boton "borrar"

Código: [Descargar] [Ocultar] [Seleccionar]
Public Sub Button5_Click()
Dim VarResult As Result
If Message.Question("¿DESEA ELIMINAR EL REGISTRO?", "SI", "NO") = 1 Then
VarResult = conexion.hconn.Edit("profesores_materias", "id_profesores_materias=" & hresul["id_profesores_materias"])
VarResult.Delete
hresul = conexion.hconn.Exec("Select * from profesores_materia")
Message.Delete("SU REGISTRO HA SIDO ELIMINADO CON ÉXITO")
Endif
End


En pocas palabras necesito el id_profesores_materias del campo de la tabla auxiliar que le comente de profesores_materias para borrar el respectivo registro consultado
 



 
última edición por jousseph el Martes, 05 Agosto 2014, 20:55; editado 1 vez 
jousseph - Ver perfil del usuarioEnviar mensaje privadoVer la galería personal del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: SQL: Como Hacer Consultas En Varias Tablas Relacionadas. 
 
jousseph:

Si lees con atención mi post, y te haces una base de datos "de prueba", con algunos datos, y aplicas las sentencias que uso, creo que es exactamente lo que necesitas.

Citar:
¿como mostrar todas la relaciones, con los datos de los profesores y de las materias?:
SELECT * FROM Materia, Profesores, Relaciones WHERE Relaciones.idprofesor=Profesores.idProfesor and Relaciones.idmateria=materia.idmateriales



Saludos
 




===================
Blog personal
Web: SoloGambas seleccion de articulos dedicados a Gambas
Visita el Curso de Gambas3 ¡¡¡Gratuito!!!
 
jsbsan - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: SQL: Como Hacer Consultas En Varias Tablas Relacionadas. 
 
Jousseph.

¿ Qué te pasa con la negrita ?.
¿ A que es bueno un cubata de ron negrita ?.  

Tengo que apuntar estos post tan interesante sobre bases de datos. Y yo sin tiempo suficiente para poner con ellos.  

Saludos
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: SQL: Como Hacer Consultas En Varias Tablas Relacionadas. 
 
Jajaja como esta señor SHELL    aquí mas enredado que una oruga en pleno capullo jajaja, saludos y poniendo negritas como para que no se pierdan en mis testamentos jejejeje.

Señor JSBSAN probé el código de su blog y me funciona perfecto pero siempre con los "peros" jajaja voy a explicar lo que me ha sucedido, yo probe esto:

SELECT id_profesores_materias,cedula_profesor, nombre, nombre_materia  FROM materias, profesores, profesores_materias
WHERE profesores_materias.fk_profesores=profesores.cedula_profesor
and profesores_materias.fk_materias=materias.id_materia

Me trae los datos exactos de las tres tablas y hasta la id_profesores_materias  que es el campo que me interesa pero ocurre algo que cuando voy a hacer una consulta con la clausula WHERE que pues logicamente la necesito para que cuando meta la cédula me  logre traer los datos ah pues no se puede porque ya hay un WHERE anteriormente, osea me explico ya tengo el where de arriba para las tres tablas pero si tambien voy a consultar eso mismos datos con otro where cedula=&texbox_cedula?, no se puede

Por ejemplo yo hago las consultas así también funciona pero el problemita es que no encuentro la manera de que me muestre también el campo ID_PROFESORES_MATERIAS de la tabla PROFESORES_MATERIAS que es la que guarda las foráneas de las dos!

"SELECT  p.cedula_profesor, p.nombre, p.direccion, p.telefono, m.id_materia,m.nombre_materia From profesores_materias pm INNER JOIN profesores p On pm.fk_profesores = p.cedula_profesor INNER JOIN materias m On pm.fk_materias = m.id_materia"

Por ejemplo aquí yo hago la consulta y me trae los respectivos datos pero no puedo ver o traer el campo de la tabla que guarda las foráneas:

hresul = conexion.hconn.Exec("Select p.cedula_profesor, p.nombre,p.direccion, p.telefono,m.id_materia,m.nombre_materia From profesores_materias pm INNER JOIN profesores p On pm.fk_profesores = p.cedula_profesor INNER JOIN materias m On pm.fk_materias = m.id_materia where nombre_materia = &1 ", ComboBox_materias.Text)


Osea yo lo que necesito es traer el campo ID de la tabla que guarda las foráneas para luego utilizarla en un boton de borrar para poder eliminar el registro que he consultado si me entiende?.
 



 
última edición por jousseph el Miercoles, 06 Agosto 2014, 00:56; editado 3 veces 
jousseph - Ver perfil del usuarioEnviar mensaje privadoVer la galería personal del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: SQL: Como Hacer Consultas En Varias Tablas Relacionadas. 
 
jousseph escribió: [Ver mensaje]
Jajaja como esta señor SHELL    aquí mas enredado que una oruga en pleno capullo jajaja, saludos y poniendo negritas como para que no se pierdan en mis testamentos jejejeje.

Señor JSBSAN probé el código de su blog y me funciona perfecto pero siempre con los "peros" jajaja voy a explicar lo que me ha sucedido, yo probe esto:

SELECT id_profesores_materias,cedula_profesor, nombre, nombre_materia  FROM materias, profesores, profesores_materias
WHERE profesores_materias.fk_profesores=profesores.cedula_profesor
and profesores_materias.fk_materias=materias.id_materia

Me trae los datos exactos de las tres tablas y hasta la id_profesores_materias  que es el campo que me interesa pero ocurre algo que cuando voy a hacer una consulta con la clausula WHERE que pues logicamente la necesito para que cuando meta la cédula me  logre traer los datos ah pues no se puede porque ya hay un WHERE anteriormente, osea me explico ya tengo el where de arriba para las tres tablas pero si tambien voy a consultar eso mismos datos con otro where cedula=&texbox_cedula?, no se puede


para usar otro where se usa una subconsulta (o se puede crear una vista en la base de datos)

select * from
(SELECT id_profesores_materias,cedula_profesor, nombre, nombre_materia  FROM materias, profesores, profesores_materias
WHERE profesores_materias.fk_profesores=profesores.cedula_profesor
and profesores_materias.fk_materias=materias.id_materia) as tabla_subconsulta where <nueva condicicion>

 


el tema original  de las 3 tablas parece ser un problema inner join left join o righ join

pero si datos de ejemplo y las tablas  de prueba    dificil  ayudar
 



 
última edición por codificador el Miercoles, 06 Agosto 2014, 02:34; editado 1 vez 
codificador - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: SQL: Como Hacer Consultas En Varias Tablas Relacionadas. 
 
Hola como están saludos, tambien saludos al señor CODIFICADOR ya logre solucionar mi problema y lo hice de dos maneras:

1-Que implemente el código del señor JSBSAN  y quedo así:

hresultado2=conexion.hconn.Exec("SELECT id_profesores_materias,cedula_profesor, nombre, direccion, telefono,id_materia,nombre_materia
FROM materias, profesores, profesores_materias
WHERE profesores_materias.fk_profesores = profesores.cedula_profesor
And profesores_materias.fk_materias = materias.id_materia order by id_profesores_materias"
)


2- Que analice e implemente un código para tres tablas de muchos a muchos optimizado para realizar mi consulta especifica con mi combobox y quedo así:

hresul = conexion.hconn.Exec("Select p.cedula_profesor, p.nombre,p.direccion, p.telefono,m.id_materia,m.nombre_materia From profesores_materias pm INNER JOIN profesores p On pm.fk_profesores = p.cedula_profesor INNER JOIN materias m On pm.fk_materias = m.id_materia where nombre_materia = &1 ", ComboBox_materias.Text)


Hago una sub consulta especifica del tipo Result para que los datos conseguidos se puedan realizar correctamente mas adelante en los botones Movenext, Moveprevious y Movelast así:

If hresul.Available Then
  While hresultado2.Available = True
If hresultado2["nombre_materia"] = hresul["m.nombre_materia"] Then
Break
Else
hresultado2.movenext
Endif
Wend


Que para después que me logra traer los datos los mismos los pueda modificar o eliminar así:

Public Sub Transporte_nombre_cedula(Data As Result)
hresul = Data
TextBox_ide.Text = hresul["id_profesores_materias"] -----------Este IDE era el que me interesaba traer
TextBox_cedula.Text = hresul["cedula_profesor"]
TextBox_nombre.Text = hresul["nombre"]  
TextBox_direccion.Text = hresul["direccion"]  
TextBox_telefono.Text = hresul["telefono"]  
TextBox_ide2.Text = hresul["id_materia"]  
ComboBox_materias.Text = hresul["nombre_materia"]
End


Que desde luego gracias al ID traído de mi tabla que guarda las llaves foráneas puedo efectuar su borrado especifico de la consulta exacta y quedo asi:

Public Sub Button5_Click()
Dim VarResult As Result
If Message.Question("¿DESEA ELIMINAR EL REGISTRO?", "SI", "NO") = 1 Then
VarResult = conexion.hconn.Edit("profesores_materias", "id_profesores_materias=" & hresul["id_profesores_materias"])
VarResult.Delete
hresul = conexion.hconn.Exec("Select * from profesores_materias")
Message.Delete("SU REGISTRO HA SIDO ELIMINADO CON ÉXITO")
Endif
End


Señor codificador

Citar:
para usar otro where se usa una subconsulta (o se puede crear una vista en la base de datos)

Código: [Ocultar] [Seleccionar]
select * from
(SELECT id_profesores_materias,cedula_profesor, nombre, nombre_materia FROM materias, profesores, profesores_materias
WHERE profesores_materias.fk_profesores=profesores.cedula_profesor
and profesores_materias.fk_materias=materias.id_materia) as tabla_subconsulta where <nueva condicicion>


Me gusta ese ejemplo que usted coloco ya que mas adelante me va a salir de ese tipo de consulta y lo voy a implementar, muchas gracias
 



 
última edición por jousseph el Miercoles, 06 Agosto 2014, 07:08; editado 4 veces 
jousseph - Ver perfil del usuarioEnviar mensaje privadoVer la galería personal del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: SQL: Como Hacer Consultas En Varias Tablas Relacionadas. 
 
Codificador:


Citar:
para usar otro where se usa una subconsulta (o se puede crear una vista en la base de datos)


+1. Muy bueno, lo voy a añadir al post.

Saludos
 




===================
Blog personal
Web: SoloGambas seleccion de articulos dedicados a Gambas
Visita el Curso de Gambas3 ¡¡¡Gratuito!!!
 
jsbsan - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: SQL: Como Hacer Consultas En Varias Tablas Relacionadas. 
 
Citar:
para usar otro where se usa una subconsulta (o se puede crear una vista en la base de datos)


Efectivamente, pero ojo con el rendimiento y la velocidad, que esas consultas con subconsultas se pueden volver una pesadilla con el tiempo.

Saludos
 



 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: SQL: Como Hacer Consultas En Varias Tablas Relacionadas. 
 
shordi y jousseph:

Citar:
pero ojo con el rendimiento y la velocidad, que esas consultas con subconsultas se pueden volver una pesadilla con el tiempo.


A propósito del rendimiento, usando vistas (View) supongo que mejorará el rendimiento, además sera más claro y cómodo añadirselas a la base de datos y luego simplemente consultarlas, o/y hacer filtros sobre ellas.

http://jsbsan.blogspot.com.es/2014/...ltas-otras.html

http://www.tutorialspoint.com/sqlite/sqlite_views.htm

Saludos
 




===================
Blog personal
Web: SoloGambas seleccion de articulos dedicados a Gambas
Visita el Curso de Gambas3 ¡¡¡Gratuito!!!
 
jsbsan - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
OcultarTemas parecidos
Tema Autor Foro Respuestas último mensaje
No hay nuevos mensajes Mostrar Varias Tablas En Grid pittusa Bases de Datos 2 Lunes, 02 Agosto 2010, 11:17 Ver último mensaje
ahtonio
No hay nuevos mensajes Guardar En Varias Tablas Con Transacciones pixel Bases de Datos 2 Jueves, 21 Julio 2011, 20:56 Ver último mensaje
pixel
No hay nuevos mensajes Comando Que Describa Las Tablas Relacionad... mg_arep19 General 2 Sabado, 01 Diciembre 2012, 17:15 Ver último mensaje
mg_arep19
No hay nuevos mensajes Hacer Consultas A Columnview Sin Una Base ... leonel Bases de Datos 10 Viernes, 25 Abril 2014, 18:16 Ver último mensaje
leonel
 

Publicar nuevo tema  Responder al tema  Página 1 de 2
Ir a la página 1, 2  Siguiente

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 
Lista de permisos
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario



  

 

cron