Lo que no se sabe expresar, es que no se sabe.
Friedrich Engels

Archivos del día 23 de January del 2008

[JDBC] - Recuperar campos de dos tablas diferentes

Queremos realizar una consulta de los datos contenidos en dos tablas diferentes. Para ello podemos utilizar una sentencia SQL del siguiente estilo:

SELECT *
FROM SOLICITUDES s, ENTIDADES e
WHERE s.COD_ESTADO = 2
AND   e.COD_ENTIDAD = s.COD_ENTIDAD

Ahora la duda es, cómo recuperar los datos ?

Si las columnas de las dos tienen nombres distintos pues no hay mayor problema, lo hacemos igual que si la consulta fuese a una única tabla:

rs.getInt("COD_SOLICITUD");

La duda surge si las dos tablas tienen dos columnas con el mismo nombre. En el ejemplo ambas tablas tienen una columna COD_ENTIDAD (aunque los valores de los resultados son iguales por la condición del AND). Desgraciadamente, el código no funciona con los alias, es decir:

rs.getInt("e.COD_ENTIDAD");

No lo interpreta como "alias.columna" sino como "columna", y por tanto da un error porque la columna no existe.

Si ejecutamos la sentencia SQL en MySQL (o en Oracle…), nos fijamos en las columnas del resultado y encontraremos "COD_ENTIDAD" y "COD_ENTIDAD_1", con lo cual ya podemos acceder a la tabla que queramos.

rs.getInt("COD_ENTIDAD");

rs.getInt("COD_ENTIDAD_1");

[JDBC] - UNION de datos tipo LONG

La sentencia  siguiente

(SELECT a.texto FROM…) UNION (SELECT a.texto FROM…)

si el campo "a.texto" es de tipo LONG da el error siguiente:

ORA-00997: uso no válido del tipo de dato LONG 

Este error se reproduce si el campo en cuestión es de tipo LOB, CLOB…

La razón es porque el comando "UNION" busca los resultados de una consulta en la otra para no duplicar los resultados, y al realizar comparaciones entre campos LONG (LOB, CLOB…) da un error.

La solución puede ser utilizar "UNION ALL", que no realiza esta comprobación y por tanto puede dar resultados duplicados.