Un saludo,
Estoy trabajando con un programa en java que extrae los datos de una base de datos en PostgreSQL 8.1 y me encuentro con el siguiente problema:
- Dentro de una transacción necesito crear dos tablas temporales con la propiedad ON COMMIT DROP, añadir campos mediante dos consultas a estas tablas, y luego ejecutar una consulta que extrae datos de estas dos tablas y de la base de datos.
- Necesito crear las tablas temporales para evitar que las consultas se repitan con cada iteración y se eternice la query.
Y aquí viene el gran problema:
Utilizamos una capa de borland (JBuilder) para Java que requiere que, para extraer los datos al programa, utilicemos una única consulta.
¿Qué solución podría adoptar?
Había pensado en encapsular de alguna manera las 5 queries para engañar a la capa de borland.
Mi código SQL es, en esencia:
Creo dos tablas auxiliares con los identificadores de los objetos que cumplen ciertas propiedades que luego quiero mostrar en una tabla al usuario.
CREATE TEMPORARY TABLE aux_muestras_pendientes_facturar (muestraid INT) ON COMMIT DROP;
CREATE TEMPORARY TABLE aux_muestras_con_ensayos_sin_actas (muestraid INT) ON COMMIT DROP;
INSERT INTO aux_muestras_pendientes_facturar (muestraid)
SELECT DISTINCT muestraid FROM ensayo_muestra
WHERE (estadoalbaran = 0 OR estadoalbaran IS NULL) AND inactivo IS NULL;
INSERT INTO aux_muestras_con_ensayos_sin_actas SELECT muestraid FROM (
SELECT DISTINCT ensayo_muestra.muestraid FROM ensayo_muestra WHERE ensayo_muestra.inactivo IS NULL
EXCEPT
SELECT DISTINCT ensayo_muestra.muestraid FROM ensayo_muestra
JOIN actas_archivo
ON actas_archivo.ensayo_muestraid = ensayo_muestra.ensayo_muestraid
WHERE (acta_clase = 1 OR acta_clase IS NULL))alias;
SELECT
pendientes.muestraid AS sin_facturar,
sin_actas.muestraid AS ensayos_pendientes,
muestra.muestraid,
muestra.albaran,
FROM muestra
JOIN ensayos ON muestra.tipomuestraid = ensayos.ensayoid
LEFT OUTER JOIN aux_muestras_pendientes_facturar pendientes ON pendientes.muestraid = muestra.muestraid
LEFT OUTER JOIN aux_muestras_con_ensayos_sin_actas sin_actas ON sin_actas.muestraid = muestra.muestraid
WHERE muestra.inactivo IS NULL
AND ((pendientes.muestraid IS NOT NULL) OR (0 = variable1))
AND ((sin_actas.muestraid IS NOT NULL) OR 0 = variable2)
Un saludo y muchas gracias