Ver Mensaje Individual
  #2 (permalink)  
Antiguo 03/11/2009, 11:12
Avatar de webness
webness
 
Fecha de Ingreso: enero-2009
Ubicación: BOGOTA
Mensajes: 312
Antigüedad: 16 años
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.