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 originalSELECT * FROM factura
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 originalSELECT f.*,vf.*
FROM factura f, variables_factura vf
WHERE f.pk_factura = vf.pk_factura AND
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.