Distinct no es una función

Es muy habitual ver consultas que emplean la cláusula distinct como si fuese una función, es decir, encerrando entre paréntesis un campo como si fuese un parámetro de invocación a la función.

Un ejemplo:

MAL
select distinct(nombre)
from persona;

La cláusula distinct sirve para evitar que aparezcan tuplas repetidas en el resultado de una consulta.

Y hay que insistir en que distinct no es una función, ni una cláusula que pueda aparecer sola. Siempre va ligada a un select previo. Así podemos usar "select distinct" o "select all", que es lo mismo que "select", ya que "all" es el modo por defecto del select (en este caso no se eliminarán los repetidos). Pero no podemos ver un "distinct" en solitario (sin estar pegado a un select previo), ni usarlo como una función.

Bueno, pero me podréis decir que si se ejecuta el comando anterior no se produce ningún error; incluso que distinct actúa y elimina los repetidos. ¿Por qué ocurre esto? Y la respuesta es que los paréntesis en el comando anterior son irrelevantes. También podríamos haberlos usado en una consulta como esta:

select (nombre), (apellidos)
from persona;

Los paréntesis alrededor del nombre de un campo no tienen ningún efecto. Podríamos compararlo a una operación aritmética como esta (1) + (2), donde los paréntesis son innecesarios.

Por eso, estas dos consultas son la misma, pero la de la izquierda es síntoma de un error de concepto (el de pensar que distinct es una función) y, por ello será penalizado en la corrección de ejercicios.

MAL
select distinct(nombre)
from persona;
BIEN
select distinct nombre
from persona;

No hay comentarios:

Publicar un comentario