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

Problema con LEFT OUTER JOIN

Estas en el tema de Problema con LEFT OUTER JOIN en el foro de Bases de Datos General en Foros del Web. BUenos días, mi consulta es la siguiente: Tengo una tabla con la siguiente estructura nmrofctra: id de la factura cdgovrble: código de cada variable que ...
  #1 (permalink)  
Antiguo 03/11/2009, 08:14
 
Fecha de Ingreso: noviembre-2009
Mensajes: 1
Antigüedad: 14 años, 6 meses
Puntos: 0
Problema con LEFT OUTER JOIN

BUenos días, mi consulta es la siguiente:

Tengo una tabla con la siguiente estructura

nmrofctra: id de la factura
cdgovrble: código de cada variable que hace parte de la factura
vlorvrble: valor de la variable

Un ejemplo de cómo se guarda la información UNA FACTURA sería:

nmrofctra cdgovrble vlorvrble

20063 nmbreclnte juan eduardo
20063 paplldo perez
20063 saplldo gonzalez
20063 drccion calle 30 no 50 - 98
20063 tlfono 3555555
20063 estdocvil soltero
20063 emprsa todo diesel ltda
20063 prsnasacrgo 2

De tal forma que tantas variables conformen una factura, tantas filas tendrá dicha factura en la tabla. Se hizo de esta manera más que todo por el dinamismo de la tabla, por no tener todas las columnas claras desde el principio y más que todo porque el cliente añadió más columnas de las contempladas desde un comienzo. Con esta estructura de tabla se pueden añadir todas la variables necesarias sin comprometer estructura de tabal y otros módulos que dependen de ésta.

El enredo está cuando por ejemplo me piden un listado con todas las facturas y las siguientes variables: estdocvil,emprsa,prsnasacrgo. Todo está muy bien si TODAS las facturas tienen esa variable, pero en el caso que prsnasacrgo NO SEA OBLIGATORIA entonces esa factura no tendrá ese registro, ni siquiera el nombre de la variable, algo así:


nmrofctra cdgovrble vlorvrble

20064 nmbreclnte elvira
20064 paplldo mogolla
20064 saplldo linero
20064 drccion calle 50 no 150 - 9
20064 tlfono 3888888
20064 estdocvil casada
20064 emprsa microsoft


Está claro que para hallar las tres variables necesito cruzar la misma tabla 3 veces, pero en caso que alguna fatura no tenga alguna de las variables (así como se muestra en el ejemplo) no se tendrá en cuenta en el cruce y quedará por fuera de mi listado. La mejor solución que encontré fue utilizar el LEFT OUTER JOIN, teniendo como primer resultado el listado de facturas que cumplen con cierto criterio necesario y además obligatorio para todas.

La pregunta es, cómo hago TRES veces el left outer join??? Quién me podría ayudar con un ejemplo???

Muchas, muchas gracias.

  #2 (permalink)  
Antiguo 03/11/2009, 11:12
Avatar de webness  
Fecha de Ingreso: enero-2009
Ubicación: BOGOTA
Mensajes: 312
Antigüedad: 15 años, 3 meses
Puntos: 5
Respuesta: Problema con LEFT OUTER JOIN

Bueno, Haber si entiendo, si te piden un listado de facturas con N variables, se supone que la persona que las pidio requiere estos 3 campos por lo tanto las facturas que no tengan estos 3 variables no satisfacen la condicion especificada po el usuario.

Segun tu plantemiento si una factura tiene las variables a,b,c,d,e otra a,b,c,d,e la tercera: b,c,e,f y la cuarta a,f y el usuario del sistema queiere las facturas que tengan a,c,f, segun tu planteamiento deberian de salir todas, pero segun mi logica no deberia de salir ninguna, como ves ninguna de las 4 facturas de ejemplo tienen los campos a,c,f, si hubiera una 5ta factura con las variables a,b,c,d,e,f, esta si debe salir del listado.


ahaora bien si quieres una consulta que saque todas las facturas que por lo menos tengan una de las variables especificadas, no es necesario que cruces la tabla:

Código SQL:
Ver original
  1. SELECT * FROM factura
  2. WHERE variable IN ('var_a','var_b','var_c','var_d')

ahora el problema es que este query devolvera N resultados por cada fila, lo que a su vez implicara mas tiempo de procesamiento para saber cuantos registros son pertenecientes a una factura. Incluso si haces el query con AND como yo entiendo el problema y no con OR como tu lo planteas pasara lo mismo.

Yo de ti, mejor acomodo la base de datos, podria ser: los datos basicos y obligatorios de la factura en una tabla factura, y otra tabla variables_factura con los campos variables, de ese modo en la tabla factura tendria un unico campo ligado a N registros en la tabla variables_factura, de ese modo el query te quedaria:

Código SQL:
Ver original
  1. SELECT f.*,vf.*
  2. FROM   factura f, variables_factura vf
  3. WHERE f.pk_factura = vf.pk_factura AND
  4.              vf.nombre_variable IN ('VAR_1','VAR_2','VAR_3')

PERO IGUAL el resultado del query serian muchos registros pa una factura.

la forma mas optima es crear estas variables no como filas sino como columnas, y con una buena clase de programacion PHP, JAVA O el lneguaje que uses administras las consultas y conexion a la base de datos, de ese modo te saldria una sola fila con todas las variables que necesitas las que no existen en NULL y te ahorras el cruce de la misma tabla. Porque el condicional quedaria:

where campo_1 = 'valor' OR campo_2='otro valor'......

Ahora bien si estas variables son definitivamente cambiantes en el tiempo, toca que uses las 2 opciones mencionadas anteriormente y asi no cruzas las tablas.
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 11:11.