En las consultas lo normal es responder preguntas positivas, por ejemplo: ¿qué productos se vendieron hoy? ¿a cuáles clientes se les cobró hoy? ¿cuáles vendedores hicieron ventas hoy?

Todas esas preguntas son positivas porque los datos están guardados en las tablas y para responderlas lo que hacemos es consultar datos que se guardaron en las tablas.

Pero a veces necesitamos responder preguntas negativas, por ejemplo: ¿cuáles productos NO se vendieron hoy? ¿a cuáles clientes NO se les cobró hoy? ¿cuáles vendedores NO hicieron ventas hoy?

En Matemática, en la teoría de conjuntos, a esto se le llama “diferencia de conjuntos” y en Firebird tenemos dos formas de conseguirlo:

  1. Negamos la función EXISTS() para hallar la diferencia entre dos conjuntos
  2. Escribimos un LEFT JOIN y un NULL en la cláusula WHERE

Ejemplo:

Tenemos una tabla llamada PRODUCTOS que tiene estas filas:

DIFERENCIA1

Captura 1. Si haces clic en la imagen la verás más grande

y una tabla llamada MOVIMDET (detalles de los movimientos) que tiene estas filas:

DIFERENCIA2

Captura 2. Si haces clic en la imagen la verás más grande

donde en la columna MOV_IDEPRD se guarda el identificador del producto. Usamos esa columna para relacionar ambas tablas.

Método 1

Para saber cuales fueron los productos que NO SE VENDIERON escribimos esta consulta:

SELECT
   PRD_IDENTI,
   PRD_NOMBRE
FROM
   PRODUCTOS P
WHERE
   NOT EXISTS(SELECT
                 M.MOV_IDEPRD
              FROM
                 MOVIMDET M
              WHERE
                 M.MOV_IDEPRD = P.PRD_IDENTI)

y obtenemos este resultado:

DIFERENCIA3

Captura 1. Si haces clic en la imagen la verás más grande

donde como puedes ver se encuentran los productos que NO ESTÁN en la tabla MOVIMDET. En la tabla MOVIMDET los productos tienen los identificadores: 13, 14, 15, 16 y ningún producto con alguno de esos identificadores es mostrado en el resultado que obtuvimos.

Método 2

Podríamos obtener exactamente el mismo resultado escribiendo:

SELECT
   PRD_IDENTI,
   PRD_NOMBRE
FROM
   PRODUCTOS P
LEFT JOIN
   MOVIMDET M
      ON P.PRD_IDENTI = M.MOV_IDEPRD
WHERE
   M.MOV_IDEPRD IS NULL

Conclusión:

Con Firebird podemos responder preguntas positivas y preguntas negativas, hay que conocer las técnicas para responder las preguntas negativas porque pueden sernos útiles muchas veces.

Artículos relacionados:

Teoría de Conjuntos: Unión, Intersección, Diferencia

El índice del blog Firebird21

Anuncios