Foros del Web » Programando para Internet » ASP Clásico »

El uso del INNER JOIN

Estas en el tema de El uso del INNER JOIN en el foro de ASP Clásico en Foros del Web. Veamos: Teniendo cuatro tablas en una base de datos: tabla_1 , tabla_2 , tabla_3 , y tabla_4 . La tabla_4 se relaciona con el campo ...
  #1 (permalink)  
Antiguo 25/04/2006, 06:45
Avatar de zacktagnan  
Fecha de Ingreso: abril-2005
Mensajes: 501
Antigüedad: 19 años, 2 meses
Puntos: 3
El uso del INNER JOIN

Veamos:

Teniendo cuatro tablas en una base de datos: tabla_1, tabla_2, tabla_3, y tabla_4.

La tabla_4 se relaciona con el campo ID de las otras tres.

Entonces, por ejemplo, en el caso de querer realizar una consulta SQL para sacar datos de las tablas tabla_1, tabla_2 y tabla_4, yo lo que hago es lo siguiente:

SQL = "SELECT * FROM tabla_1 INNER JOIN (tabla_4 INNER JOIN tabla_2 ON tabla_4.eltbl2_ID=tabla_2.tbl2_ID) ON tabla_1.tbl1_ID=tabla_4.eltbl1_ID"


Lo que no sé es como sería una SQL para sacar datos de las cuatro tablas a la vez, siguiendo con que la tabla_4 está relacionada con las otras tres.
¿Cómo se construye entonces el INNER JOIN? si es que se puede.

¿ó habría que hacerlo de otra manera?

Saludos,

zacktagnan.
==========================================
  #2 (permalink)  
Antiguo 25/04/2006, 10:38
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
Algo más o menos así:


Código:
SELECT a.*, b.*, c.*, d.* FROM tbl_uno a INNER JOIN tbl_dos b ON a.id = b.id INNER JOIN 
tbl_tres c ON c.id = b.id INNER JOIN tbl_cuatro d ON d.id = c.id [WHERE condiciones]

Saludos
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #3 (permalink)  
Antiguo 26/04/2006, 04:05
Avatar de zacktagnan  
Fecha de Ingreso: abril-2005
Mensajes: 501
Antigüedad: 19 años, 2 meses
Puntos: 3
¿Me lo puedes explicar un poquito?

Si tbl_uno, tbl_dos, tbl_tres y tbl_cuatro son los nombres de las tablas de la base de datos, ¿a qué hace referencia a, b, c, d?

Y con a.*, b.*, c.*, d.* ¿qué haces? ¿se trata de realizar el SELECT * cuatro veces u otra cosa? ¿Ó es una especie de dividirlo en cuatro partes?

Y lo de poner "...FROM tbl_uno a INNER JOIN tbl_dos b ON...", ¿a qué se refieren aquí la a y la b?

Saludos,

zacktagnan.
================================================== ====
  #4 (permalink)  
Antiguo 26/04/2006, 05:43
 
Fecha de Ingreso: abril-2006
Mensajes: 166
Antigüedad: 18 años, 1 mes
Puntos: 0
Sonrisa

Hola!

En vez de los nombres de las tablas u_goldman ha optado por ponerles los seudónimos a,b,c,d.

Ejemplo:

SELECT a.*,b.*
FROM tabla1 a,tabla2 b
WHERE a.codpersona=b.codpersona

En el FROM estoy asignando a la tabla1 el nombre "a" y a la tabla2 el nombre "b". Es para no tener que andar poniendo todo el rato el nombre de las tablas. No obstante, puedes omitirlo y poner en vez de "a" puedes poner tranquilamente "tabla1".

La consulta que he puesto arriba equivale a esta:

SELECT tabla1.*,tabla2.*
FROM tabla1,tabla2
WHERE tabla1.codpersona=tabla2.codpersona

Espero que me haya explicado.

Un saludo
  #5 (permalink)  
Antiguo 26/04/2006, 05:59
Avatar de zacktagnan  
Fecha de Ingreso: abril-2005
Mensajes: 501
Antigüedad: 19 años, 2 meses
Puntos: 3
Vale,

Pero bueno yo he probado lo propuesto y me da error por "...Error de sintaxis (falta operador)..."

No sé si comprendo mal, pero lo propuesto ¿no relaciona la tbl_uno con la tbl_dos, la tbl_dos con la tbl_tres y la tbl_tres con la tbl_cuatro?

Si es así, no es lo que demandaba

Detalladamente yo tengo las siguientes tablas en la base de datos
- tipopromo
- tipovivienda
- viviendas
- promos

Y la tabla promos es la que se relaciona con las demás según estos campos:
promos.promo_tiprom=tipopromo.tiprom_id
promos.promo_tipoviv=tipovivienda.tipviv_id
promos.promo_id=viviendas.viv_promo

Entonces, ¿¿¿cómo sería el SELECT con los INNER JOIN???

Saludos,

zacktagnan.
================================================
  #6 (permalink)  
Antiguo 26/04/2006, 10:08
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
Vamos, con un poco de voluntad y analogía es suficiente, nada mas necesitas comprar esos campos con su tabla de unión, lo que yo puse es nada más como se estructura un INNER JOIN, obviamente que copy & paste no funcionará para casos particulares:

Código:
...INNER JOIN tipopromo ON promos.id = tipopromo.tiprom_id INNER JOIN 
tipovivivienda ON promos_tipoviv = tipovivienda.tipviv_id INNER JOIN viviendas
 ON viviendas.viv_promo = promos.promo_id [WHERE condiciones]
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #7 (permalink)  
Antiguo 27/04/2006, 01:47
Avatar de zacktagnan  
Fecha de Ingreso: abril-2005
Mensajes: 501
Antigüedad: 19 años, 2 meses
Puntos: 3
Gracias por responder. Pero me sigue dando error.

A ver, yo he puesto esto:

<%
...
Dim rs_InnerJoin4
Set rs_InnerJoin4 = Server.CreateObject("ADODB.Recordset")
rs_InnerJoin4.ActiveConnection = conexHenJavUSU
rs_InnerJoin4.Source = "SELECT viv_ref, viv_total, viv_numpiso, promo_nom, promo_inic, promo_tiprom, tipviv_nom FROM promos INNER JOIN tipopromo ON promos.promo_tiprom = tipopromo.tiprom_id INNER JOIN tipovivivienda ON promos_tipoviv = tipovivienda.tipviv_id INNER JOIN viviendas ON viviendas.viv_promo = promos.promo_id WHERE viv_activa=true AND promo_activa=true"
rs_InnerJoin4.CursorType = 0
rs_InnerJoin4.CursorLocation = 3
rs_InnerJoin4.LockType = 3
rs_InnerJoin4.Open'<<LÍNEA 32

%>


Y al probar en el Navegador, me da este Error:

"Tipo de error:
Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)
[Microsoft][Controlador ODBC Microsoft Access] Error de sintaxis (falta operador) en la expresión de consulta 'promos.promo_tiprom = tipopromo.tiprom_id INNER JOIN tipovivivienda ON promos_tipoviv = tipovivienda.tipviv_id INNER JOIN viviendas ON promos.promo_id = viviendas.viv_promo'.
/hendayajavier_carpetas/pruebaInnerJoin4.asp, línea 32
"
  #8 (permalink)  
Antiguo 27/04/2006, 09:06
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
Segun yo deberia ser un problema con el tipo de dato, revisa que sean del mismo tipo de dato, te recomiendo que vayas uniendo una por una para identificar mejor donde esta el problema.

Saludos
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #9 (permalink)  
Antiguo 28/04/2006, 02:42
Avatar de zacktagnan  
Fecha de Ingreso: abril-2005
Mensajes: 501
Antigüedad: 19 años, 2 meses
Puntos: 3
Buenas, de nuevo.

Al final, buscando en Google, encontré la sugerencia de, para sacar el SQL deseado, realizar una consulta en Acces para recoger la sentencia en SQL.

Lo que me dió:

"SELECT viv_ref, promo_nom FROM (tipovivienda INNER JOIN (tipopromo INNER JOIN promos ON tipopromo.tiprom_id = promos.promo_tiprom) ON tipovivienda.tipviv_id = promos.promo_tipoviv) INNER JOIN viviendas ON promos.promo_id = viviendas.viv_promo WHERE viv_activa=true AND promo_activa=true"

¡¡Y ya no me da error!!

Gracias por la ayuda y las sugerencias...

Saludos,

zacktagnan.
================================================== =====
  #10 (permalink)  
Antiguo 28/04/2006, 02:49
 
Fecha de Ingreso: abril-2006
Mensajes: 166
Antigüedad: 18 años, 1 mes
Puntos: 0
De acuerdo

Hola.

Si, es un buen truco al que puedes recurrir siempre y además funciona muy bien. Creía que que lo conocias... El problema supongo que sería los paréntesis.

Encantado de ayudarte.

Saludos
  #11 (permalink)  
Antiguo 28/04/2006, 04:04
Avatar de zacktagnan  
Fecha de Ingreso: abril-2005
Mensajes: 501
Antigüedad: 19 años, 2 meses
Puntos: 3
El truco no es que me fuera del todo desconocido es que, a veces, recurres a él y te saca un código que cuando lo llevas al de ASP no funciona porque ciertos caracteres deben ser puestos de diferente manera.

Pero esta vez va bien...

Hasta otra...

zacktagnan.
======================================
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 18:16.