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

Problemas de orientacion: LEFT JOIN o INNER JOIN

Estas en el tema de Problemas de orientacion: LEFT JOIN o INNER JOIN en el foro de SQL Server en Foros del Web. Hola, acabo de empezar a trabajar con bases de datos hace poco y me encuentro siempre con el mismo problema. No sé en que order ...
  #1 (permalink)  
Antiguo 20/08/2009, 02:28
 
Fecha de Ingreso: agosto-2009
Mensajes: 10
Antigüedad: 14 años, 9 meses
Puntos: 0
Mensaje Problemas de orientacion: LEFT JOIN o INNER JOIN

Hola,

acabo de empezar a trabajar con bases de datos hace poco y me encuentro siempre con el mismo problema. No sé en que order situar las relaciones entre las tablas o JOINS para obtener el resultado indicado. Ya sé que hay millones de tutoriales en internet con un par de ejemplos sobre como trabajar con INNER, LEFT, RIGHT y otros JOINS, pero el problema es que todos los ejemplos son siempre muy sencillos, como máximo con tres tablas...
Ahora bien, ¿qué sucede cuando hay muchas tablas? ¿Cuál debe ser considerada "tabla izquiera" y cuál "tabla derecha"? Ejemplo:

client------------->company------------------->debitor-------->debitorText
|
|
|
|
creditor----------->invoice<-----------------------
|
|
|--->creditorText

En este caso hay una "bifurcación", porque hay dos ramas en las relacciones entre las tablas. Por un lado, en direccion al debitor la consulta se vería así:

client cl INNER JOIN
company co ON cl.id = co.id_client INNER JOIN
debitor deb ON co.id = deb.id_company INNER JOIN
invoice inv ON deb.id = inv.id_debitor ..... etc. etc.

Pero, ¿qué sucede con la ramificación de "creditor"? Porque, después de introducir invoice inv ON deb.id = inv.id_debitor ya no sé cual es la tabla izquierda y cual la derecha en este JOIN... Y realmente si continúo así:

client cl INNER JOIN
company co ON cl.id = co.id_client INNER JOIN
debitor deb ON co.id = deb.id_company INNER JOIN
invoice inv ON deb.id = inv.id_debitor INNER JOIN
creditor cred ON cl.id = cred.id_client AND inv.id_creditor = cred.id INNER JOIN
creditorText credTxt ON cred.id = credTxt.id_creditor etc etc.

La tabla izquierda es client, ¿cierto? No es invoice, ¿verdad? O quizás debería considerarlo así:

tipo de JOIN + tabla derecha + donde + indice tabla izda. + indice tabla derecha

INNER JOIN + creditor cred + ON + client .id = cred.id


¿Me podrías recomendar tutoriales o ejemplos sencillos que me puedan ayudar con estas consultas no tan sencillas? ¿Cómo saber donde está mi tabla derecha y mi tabla derecha?

Disculpalme toda la gente cuya inteligencia se pueda sentir ofendida por esta pregunta, pero en algún momento todos somos principiantes.

Gracias por adelantado

Última edición por diego_hanseatico; 20/08/2009 a las 02:56
  #2 (permalink)  
Antiguo 20/08/2009, 06:47
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
Respuesta: Problemas de orientacion: LEFT JOIN o INNER JOIN

No entendi muy bien la duda, pero te comento, cuando he tenido consultas asi, sacar los movimientos de debido y credito de todos los clientes... lo hago por separado, haciendo joins segun el tipo y metiendolos en subqueries...al final con left y tomando como base los clientes obtengo el resultado...

por ejemplo...
Código:
SELECT *
FROM Clientes Cl
Left outer join 
       (
       SELECT IdCliente, [resto de campos]
       FROM Creditos
       WHERE Miscondiciones
       ) Cr
On  Cl.IdCliente = Cr.IdCliente
Left outer join 
       (
       SELECT IdCliente, [resto de campos]
       FROM Debitos
       WHERE Miscondiciones
       ) Db
On  Cl.IdCliente = Db.IdCliente
En tu caso si la factura incluye ambos ids creo que deberia ser tu tabla base para que de ahi puedas ligar hacia ambos sentidos...

en fin, depende mucho de lo que quieras obtener para un requerimiento especifico...

pero algo importante y que siempre aplica: con el inner join siempre te traes lo que hace match en ambas tablas, no importa cual vaya primero o cual despues...

y con el left siempre te traes los registros de la tabla que esta a la izquierda, independientemente si hace match con los registros de la derecha...

con el right es similar al left...

por lo que son cosas distintas del inner...


Saludos!
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #3 (permalink)  
Antiguo 20/08/2009, 07:54
 
Fecha de Ingreso: agosto-2009
Mensajes: 10
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: Problemas de orientacion: LEFT JOIN o INNER JOIN

Gracias Andrés,

Mi duda era general, porque normalmente no sé qué método y orden seguir para escribir los JOINS. Los conceptos INNER, LEFT o RIGHT JOIN los entiendo más o menos. Mi problema es implementarlo cuando tengo tal cantidad de tablas que están interrelacionadas. Pero el consejo que me has dado de empezar escribiendo JOINS por el recibo (invoice) me parece muy últil. Hasta ahora, en mi proyecto siempre he empezado por client, que no está subordinado a ninguna otra tabla... Pero también tengo otras tablas que no están subordinadas a ninguna otra y ramificaciones que me hacen dudar de que está a la izquierda en un INNER JOIN cuando escribo, por ejemplo:

client cl INNER JOIN
company co ON cl.id = co.id_client INNER JOIN
debitor deb ON co.id = deb.id_company

y después añado un...

INNER JOIN creditor cred ON cl.id = cred.id_client AND inv.id_creditor = cred.id

¿a qué se refiere este último inner join (en naranja)? Parece que se refiere a client, ¿no? Y si entre client cl... Vienen otras tablas de las que tb. dependiera creditor? Por ejemplo:

client cl INNER JOIN
company co ON cl.id = co.id_client INNER JOIN
debitor deb ON co.id = deb.id_company INNER JOIN
clientAccount ca ON cl.id = ca.id_debitor INNER JOIN
creditor cred ON cl.id = cred.id_client AND inv.id_creditor = cred.id
AND ca.id = cred.id_clientAccount

En este caso, ¿a quién se refiere el inner join a client, a clientAccount o a los dos?
No sé, ese es el concepto que no me queda claro... Cuando sólo hay una secuencia de dependencias entre tablas, no es ningún problema. Claro, que en este caso, como tú dices con el INNER JOIN lo que hace match en ambas tablas, no importa cual vaya primero o cual despues, es lo que obtengo... Pero, ¿lo que hace match en client o lo que también hiciera match en clientAccount, o en ambas tablas?

Si me pudieséis dar algún tip o links de tutoriales y ejemplos, pues me iba a alegrar mucho.

Gracias
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:34.