Relacionando dos tablas: la forma vieja y la forma nueva

2 comentarios

En Firebird, cuando queremos relacionar dos tablas (o conjuntos de resultados) entre sí tenemos dos posibilidades:

  1. Usando la forma vieja
  2. Usando la forma nueva

Caso 1. Usando la forma vieja

Esta sintaxis fue establecida en el año 1989. Las tablas se listan separadas por comas después de la cláusula FROM y la condición que las relaciona se pone en la cláusula WHERE. No hay una sintaxis especial que distinga cuales de las condiciones del WHERE son para filtrar filas y cuales son para relacionar tablas, se supone que mirando la sentencia el desarrollador sabrá cual es cual.

¿Problemas?

  • La cláusula WHERE puede volverse muy larga y muy complicada de leer porque se la usa para relacionar tablas y también para filtrar filas
  • Solamente se pueden relacionar tablas que tengan valores idénticos, si una de las tablas tiene NULL en una columna no se podrá hacer la relación. En otras palabras: solamente se puede hacer un INNER JOIN, no se pueden hacer OUTER JOIN.

Sintaxis:

SELECT
   MiColumna1,
   MiColumna2
FROM
   MiTabla1,
   MiTabla2
WHERE
   MiCondición

Caso 2. Usando la forma nueva

Esta sintaxis fue establecida en el año 1992. La tabla principal se coloca después de la cláusula FROM y la tabla secundaria se coloca después de la cláusula JOIN, la condición que las relaciona se coloca después de ON. Por lo tanto se puede distinguir fácilmente cual es la condición usada para relacionar a la tablas y cual es la condición usada para filtrar filas, no hay confusión posible.

¿Ventajas?

  • Es muy fácil saber cual es la condición usada para relacionar a las dos tablas
  • Es muy fácil saber cual es la condición usada para filtrar filas
  • La cláusula WHERE es más corta y por lo tanto más fácil de leer que cuando se usa la forma vieja
  • Se puede usar tanto INNER JOIN como OUTER JOIN

Sintaxis:

SELECT
   MiColumna1,
   MiColumna2
FROM
   MiTabla1
JOIN
   MiTabla2
      ON MiCondición

Cuidado:

Tú puedes elegir cualquiera de las dos formas para relacionar tablas pero NUNCA debes mezclarlas. En un SELECT o usas la forma vieja o usas la forma nueva, no las mezcles, porque si las mezclas eso solamente te ocasionará problemas y ningún beneficio.

Recomendación:

La forma nueva es mejor, por eso se la inventó, por eso existe. Si ya tienes SELECTs escritos con la forma vieja y funcionan bien entonces déjalos como están, no los toques, pero para escribir todos tus nuevos SELECTs usa la forma nueva porque es la que verás cada vez más en todos los libros y documentos sobre SQL. Y es además la que siempre se usa en este blog.

Artículos relacionados:

Entendiendo a los JOIN

JOIN implícito y JOIN explícito

El índice del blog Firebird21

 

Anuncios

Arithmetic overflow or division by zero has occurred

Deja un comentario

Si ves el mensaje: “Arithmetic overflow or division by zero has occurred. Arithmetic exception, numeric overflow, or string truncation. String right truncation”

¿Qué significa?

Que el Firebird encontró un error grave y por eso detuvo el procesamiento. Ese error grave pudo ser debido a un error matemático (por ejemplo, división por cero), a un sobreflujo (se quiso guardar en una columna numérica un número mayor al máximo permitido), o un error de cadena (se quiso guardar en una columna una cadena de mayor longitud que la definida).

La última frase: “String right truncation” nos da la pista de cual de esos errores fue detectado. En este caso, se quiso guardar una cadena de mayor longitud que la definida.

Esto puede ocurrir en dos ocasiones típicas:

  1. Al querer hacer un INSERT o un UPDATE a una columna
  2. Al querer hacer un SELECT a una vista cuya tabla ha cambiado su estructura

Caso 1. Al querer hacer un INSERT o un UPDATE a una columna

La columna por ejemplo está definida como VARCHAR(30) y queremos guardar en ella más de 30 caracteres

¿Solución? Aumentar el ancho que la columna tiene en la tabla o disminuir la cantidad de caracteres a guardar en la columna

Caso 2. Al querer hacer un SELECT a una vista cuya tabla ha cambiado su estructura

La columna por ejemplo está definida como VARCHAR(30), creamos una vista que usa esa columna, luego modificamos la columna a VARCHAR(40), al hacer SELECT de la vista obtenemos el error. ¿Por qué? porque la vista es un SELECT compilado y se compiló cuando la columna estaba definida como VARCHAR(30), eso es lo que conoce la Base de Datos. Si más tarde cambiamos la longitud de la columna a 40 la vista no está enterada de ese cambio, detecta una inconsistencia y muestra el error.

¿Solución?

Volver a compilar la vista. Al recompilar la vista, ésta ya usará la nueva longitud.

Para que el cambio tenga efecto deberás desconectarte de la Base de Datos y volver a conectarte.

Artículo relacionado:

El índice del blog Firebird21