BookinglyTech News
Software

Cómo las distintas uniones de PostgreSQL afectan el conteo de filas

El artículo demuestra con una base hospitalaria de diez filas cómo INNER, LEFT, RIGHT y anti‑joins eliminan o preservan registros, y por qué la elección de la unión importa para consultas reales.

2 min de lecturaDev.to0 vistas

¿Qué pasa con las filas que no tienen pareja?

El autor muestra una base de datos hospitalaria de diez pacientes, diez doctores y diez citas. Con esta tabla pequeña se puede contar cada fila y observar cómo cada tipo de join afecta el resultado.

INNER JOIN

SELECT a.appointment_id,
       p.full_name AS patient_name,
       d.full_name AS doctor_name,
       a.appt_date,
       a.diagnosis
FROM   appointments a
INNER JOIN patients p ON p.patient_id = a.patient_id
INNER JOIN doctors d ON d.doctor_id = a.doctor_id;

Solo devuelve las diez citas con nombres de paciente y doctor. Los pacientes que nunca tuvieron cita y los doctores sin pacientes desaparecen, lo cual es correcto cuando la pregunta es «¿qué citas existen?».

LEFT JOIN (del lado de pacientes)

SELECT p.full_name,
       a.appointment_id,
       a.appt_date,
       a.diagnosis
FROM   patients p
LEFT JOIN appointments a ON p.patient_id = a.patient_id;

El resultado son 12 filas: diez citas y dos pacientes sin citas con columnas nulas. La unión mantiene todas las filas de la tabla izquierda y duplica las que tienen múltiples citas.

Anti‑join (LEFT JOIN + IS NULL)

Para encontrar pacientes sin citas:

SELECT p.full_name,
       p.city
FROM   patients p
LEFT JOIN appointments a ON p.patient_id = a.patient_id
WHERE  a.appointment_id IS NULL;

Se obtienen las dos filas faltantes. Es crucial usar una columna que no pueda ser nula (como la PK) para la condición IS NULL.

RIGHT JOIN (del lado de doctores)

El mismo concepto pero invertido:

SELECT d.doctor_id,
       d.full_name,
       p.full_name AS patient,
       a.appointment_id
FROM   appointments a
RIGHT JOIN doctors d ON a.doctor_id = d.doctor_id
LEFT JOIN patients p ON p.patient_id = a.patient_id;

Se obtienen 13 filas: diez citas y tres doctores sin pacientes, con columnas nulas. La mayoría de los desarrolladores prefieren escribir FROM doctors d LEFT JOIN appointments a para evitar el RIGHT JOIN.

Por qué importa

Elegir el join correcto no solo afecta el número de filas, sino también la semántica de la consulta. En entornos de producción, un INNER JOIN que omite registros críticos puede provocar errores de negocio. Por eso, revisar la cardinalidad y la presencia de valores nulos antes de escribir la cláusula JOIN es esencial.

Conclusión

Esta pequeña demo muestra que el join no es una operación mecánica; es una decisión que define qué datos se presentan. Con un esquema tan sencillo, se puede observar de inmediato cómo las distintas uniones multiplican o eliminan filas. En tu trabajo, antes de lanzar la consulta, pregúntate: ¿qué registros quiero incluir y cuáles debo excluir? La respuesta cambiará la cláusula JOIN.

Enlace al artículo original