Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

[SOLUCIONADO] Inconveniente con el uso de INNER JOIN

Estas en el tema de Inconveniente con el uso de INNER JOIN en el foro de Mysql en Foros del Web. Hola a todos. Quería comunicar y consultar un problema que tengo al momento de crear una VIEW en un archivo de SQl. La idea es ...
  #1 (permalink)  
Antiguo 09/10/2014, 23:00
Avatar de sergiomaidana1989  
Fecha de Ingreso: abril-2013
Ubicación: Vera, Santa Fe
Mensajes: 70
Antigüedad: 11 años
Puntos: 0
Inconveniente con el uso de INNER JOIN

Hola a todos.
Quería comunicar y consultar un problema que tengo al momento de crear una VIEW en un archivo de SQl.
La idea es crear una Vista que abajarque campos de 5 tablas que están relacionadas entre sí. A continuación, colocaré un enlace de descarga para que veas las relaciones entre estas 5 tablas. Es un simple archivo de imagen JPEG.
https://mega.co.nz/#!ScUGzDAK!TRx-6I...iBIgldBLjpX8Zw

¡Bien! Ahora paso a explicar qué campos quiero incluir en esta VIEW:
  • idSecrVinc: TB_SecretariasVincMComision
    idSecr: TB_SecretariasVincMComision
    nomSecr: TB_Secretarias
    docMC: TB_SecretariasMComision
    apeMC: TB_MComision
    nomMC: TB_MComision
    fecnacMC: TB_MComision
    sexoMC: TB_MComision
    domMC: TB_MComision
    idLoc: TB_MComision
    nomLoc: TB_Localidades
    provLoc: TB_Localidades
    telMC: TB_MComision
    celMC: TB_MComision
    emailMC: TB_MComision
    idCargo: TB_MComision
    nomCargo: TB_Cargos
    tipoCargo: TB_Cargos
    obsMC: TB_MComision

Explicaré rápidamente que contiene cada tabla. Algunas caen de madurez, pero explico igual.
La Tabla TB_MComision contiene datos referentes a los Miembros de la Comisión.
TB_Secretarias incluye datos referentes a las secretarías disponibles para cada miembro.
En la Tabla TB_SecretariasVincMComision, se guardan las secretarías a las que pueden pertenecer aquellos miembros.
En TB_Localidades se almacenan las localidades que se pueden elegir para otorgar a cada miembro.
En TB_Cargos se incluye información sobre los cargos que puede tener cada miembro de comisión.

TB_SecretariasVincMComision sería la tabla principal en esta consulta, ya que de ella se bosquejarían todos los otros datos que parten de cada tabla correspondiente.

Este es el código fuente que pude hacer. Pero algo está mal. Lo hice pensándo en que la VIEW se crearía con algo así.
Código SQL:
Ver original
  1. CREATE VIEW VW_SecretariasVincMComision AS SELECT TB_SecretariasVincMComision.idSecrVinc,
  2. TB_SecretariasVincMComision.idSecr, TB_Secretarias.nomSecr, TB_SecretariasVincMComision.docMC,
  3. TB_MComision.apeMC, TB_MComision.nomMC, CONCAT(TB_MComision.apeMC,' ',TB_MComision.nomMC) AS apenomMC,
  4. TB_MComision.fecnacMC, TB_MComision.sexoMC, TB_MComision.domMC, TB_MComision.idLoc, TB_Localidades.nomLoc,
  5. TB_Localidades.provLoc, TB_MComision.telMC, TB_MComision.celMC, TB_MComision.emailMC, TB_MComision.idCargo,
  6. TB_Cargos.nomCargo, TB_Cargos.tipoCargo, TB_MComision.obsMC ...
  7. TB_SecretariasVincMComision INNER JOIN TB_Secretarias ON TB_SecretariasVincMComision.idSecr=TB_Secretarias.idSecr
  8. INNER JOIN TB_MComision ON TB_SecretariasVincMComision.docMC=TB_MComision.docMC    
  9. TB_MComision INNER JOIN TB_Localidades ON TB_MComision.idLoc=TB_Localidades.idLoc
  10. INNER JOIN TB_Cargos ON TB_MComision.idCargo=TB_Cargos.idCargo ;
Donde están los "..." iría un conecto o separador para separar las dos relaciones INNER JOIN. Pero no sé cual sería este conector o nexo. He probado con "AND" y ",", pero solo logré que me de ERROR.

POR FAVOR, ALGUIEN PUEDE AYUDARME.
Espero haberme explicado.

Muchas gracias. Un saludo.
__________________
Sergio Daniel Maidana
  #2 (permalink)  
Antiguo 10/10/2014, 03:09
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Inconveniendo con el uso de INNER JOIN

No veo el FROM de esa consulta.
Además, hay una tabla que ya se incluyó en un INNER JOIN y que está puesta porque sí.
Por otro lado, no estás usando alias, con lo que la lectura de algo tan simple se complica mucho.

Depurando la basura sería:
Código MySQL:
Ver original
  1. CREATE VIEW VW_SecretariasVincMComision AS
  2.     SC.idSecrVinc,
  3.     SC.idSecr,
  4.     S.nomSecr,
  5.     SC.docMC,
  6.     MC.apeMC,
  7.     MC.nomMC,
  8.     CONCAT(MC.apeMC,' ',MC.nomMC) apenomMC,
  9.     MC.fecnacMC,
  10.     MC.sexoMC,
  11.     MC.domMC,
  12.     MC.idLoc,
  13.     L.nomLoc,
  14.     L.provLoc,
  15.     MC.telMC,
  16.     MC.celMC,
  17.     MC.emailMC,
  18.     MC.idCargo,
  19.     CR.nomCargo,
  20.     CR.tipoCargo,
  21.     MC.obsMC
  22.     TB_SecretariasVincMComision SC
  23.     INNER JOIN TB_Secretarias S ON SC.idSecr=S.idSecr
  24.     INNER JOIN TB_MComision MC ON SC.docMC=MC.docMC    
  25.     INNER JOIN TB_Localidades L ON MC.idLoc=L.idLoc
  26.     INNER JOIN TB_Cargos CR ON MC.idCargo=CR.idCargo ;

Nota: El "AS" es innecesario desde hace años. Evitalo, porque sólo sirve para hacer más confusa la lectura.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 10/10/2014 a las 17:09
  #3 (permalink)  
Antiguo 10/10/2014, 10:35
Avatar de sergiomaidana1989  
Fecha de Ingreso: abril-2013
Ubicación: Vera, Santa Fe
Mensajes: 70
Antigüedad: 11 años
Puntos: 0
Respuesta: Inconveniendo con el uso de INNER JOIN

Tenes razón, falata el FROM. Pero bueno lo tenía antes. Lo que pasa es que copié mal el código SQL.
¿Me podes ayudar a hacer esta consulta?

No sé que sería un Alias. No manejo mucho lenguaje SQL y las cosas medio complejas como esta no las sé hacer.

En realidad, el código que debí haber incluído es el siguiente:
Código SQL:
Ver original
  1. CREATE VIEW VW_SecretariasVincMComision AS SELECT TB_SecretariasVincMComision.idSecrVinc,
  2. TB_SecretariasVincMComision.idSecr, TB_Secretarias.nomSecr, TB_SecretariasVincMComision.docMC,
  3. TB_MComision.apeMC, TB_MComision.nomMC, CONCAT(TB_MComision.apeMC,' ',TB_MComision.nomMC) AS apenomMC,
  4. TB_MComision.fecnacMC, TB_MComision.sexoMC, TB_MComision.domMC, TB_MComision.idLoc, TB_Localidades.nomLoc,
  5. TB_Localidades.provLoc, TB_MComision.telMC, TB_MComision.celMC, TB_MComision.emailMC, TB_MComision.idCargo,
  6. TB_Cargos.nomCargo, TB_Cargos.tipoCargo, TB_MComision.obsMC FROM
  7. TB_SecretariasVincMComision INNER JOIN TB_Secretarias ON TB_SecretariasVincMComision.idSecr=TB_Secretarias.idSecr
  8. INNER JOIN TB_MComision ON TB_SecretariasVincMComision.docMC=TB_MComision.docMC ...
  9. TB_MComision INNER JOIN TB_Localidades ON TB_MComision.idLoc=TB_Localidades.idLoc
  10. INNER JOIN TB_Cargos ON TB_MComision.idCargo=TB_Cargos.idCargo ;
Los "..." iban en otra parte. Donde estaban los "..." anteriormente iba el FROM.

¿Entonces cómo lo puedo hacer?

Me decis que evite el AS. Pero ¿Bajo todas las circunstancias? No lo quité en el código fuente. En él hay dos.

¿Me ayudas?
__________________
Sergio Daniel Maidana
  #4 (permalink)  
Antiguo 10/10/2014, 10:56
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Inconveniendo con el uso de INNER JOIN

Primero prueba lo que pasé, tal como lo puse, y dinos si funciona y si cumple o no con el resultado.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 10/10/2014, 16:35
Avatar de sergiomaidana1989  
Fecha de Ingreso: abril-2013
Ubicación: Vera, Santa Fe
Mensajes: 70
Antigüedad: 11 años
Puntos: 0
Respuesta: Inconveniendo con el uso de INNER JOIN

Ah si, disculpa. Probé el código como me lo pasaste y me da el siguiente mensaje de error:
ERROR 1054 (42S22): Unknown column 'TB_Secretarias.nomSecr' in 'field list'.

Ahora bien, te pregunto: Ahí en donde pusiste SC va TB_SecretariasVincMComision y donde pusiste CR iría TB_Cargos ¿No?
De paso, ¿Me podes explicar a grandes rasgos qué es un Alias?

Gracias.
__________________
Sergio Daniel Maidana
  #6 (permalink)  
Antiguo 10/10/2014, 17:08
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Inconveniendo con el uso de INNER JOIN

Cita:
Iniciado por sergiomaidana1989 Ver Mensaje
Probé el código como me lo pasaste y me da el siguiente mensaje de error:
ERROR 1054 (42S22): Unknown column 'TB_Secretarias.nomSecr' in 'field list'..
Si te da ese error, entonces hiciste un Copy+Paste de lo que te pasé porque no lo analizaste, no debe quedar ninguna columna indicada por el nombre de la tabla sino por el alias aplicado.
La próxima vez trata de analizar lo que se postea. Suele haber errores de tipeo...

Usa esto:
Código MySQL:
Ver original
  1. CREATE VIEW VW_SecretariasVincMComision AS
  2.     SC.idSecrVinc,
  3.     SC.idSecr,
  4.     S.nomSecr,
  5.     SC.docMC,
  6.     MC.apeMC,
  7.     MC.nomMC,
  8.     CONCAT(MC.apeMC,' ',MC.nomMC) apenomMC,
  9.     MC.fecnacMC,
  10.     MC.sexoMC,
  11.     MC.domMC,
  12.     MC.idLoc,
  13.     L.nomLoc,
  14.     L.provLoc,
  15.     MC.telMC,
  16.     MC.celMC,
  17.     MC.emailMC,
  18.     MC.idCargo,
  19.     CR.nomCargo,
  20.     CR.tipoCargo,
  21.     MC.obsMC
  22.     TB_SecretariasVincMComision SC
  23.     INNER JOIN TB_Secretarias S ON SC.idSecr=S.idSecr
  24.     INNER JOIN TB_MComision MC ON SC.docMC=MC.docMC    
  25.     INNER JOIN TB_Localidades L ON MC.idLoc=L.idLoc
  26.     INNER JOIN TB_Cargos CR ON MC.idCargo=CR.idCargo ;
Cita:
¿Me podes explicar a grandes rasgos qué es un Alias?
Es una pregunta para manual básico, pero considerando que tu mismo has puesto esto:
Código MySQL:
Ver original
  1. CONCAT(TB_MComision.apeMC,' ',TB_MComision.nomMC) AS apenomMC
no deberías tener esa duda... Lo que pones detrás de ese "AS" es un alias.

La única diferencia es que yo no pongo el "AS" porque es una cláusula obsoleta, descartada del estandar hacer bastantes años, y que sólo persiste en los manuales viejos (también obsoletos) y en alguna que otra base que usa un servidor MySQL anterior a la versión 3.2.x (no son muchos los que quedan).
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 11/10/2014, 01:10
Avatar de sergiomaidana1989  
Fecha de Ingreso: abril-2013
Ubicación: Vera, Santa Fe
Mensajes: 70
Antigüedad: 11 años
Puntos: 0
Respuesta: Inconveniente con el uso de INNER JOIN

Estuve revisando con detenimiento el código que me pasaste en la última respuesta que me has dado. Analicé las cosas y lo entendí a la perfección. No tenía ni idea que fuese bastante facil hacer lo que quería.
No tenía ni idea que se hiciera de esa forma. Pero gracias a ello, pude aplicarlo a otras consultas de SQL.

Tampoco tenía idea que el "AS" no se usaba más desde hace bastantes años.

En fin, gracias por todo. Me has enseñado mucho en un solo Posteo.

Un saludo y abrazo.
__________________
Sergio Daniel Maidana

Etiquetas: campo, join, select, sql, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:25.