Engineering2026-07-21

La consulta SQL que me llevó 3 horas depurar (no cometas mi error)

Pasé una tarde entera persiguiendo un fantasma en mi base de datos. El culpable? Algo que una herramienta básica de formateo habría detectado en cinco minutos.

Déjame poner la escena. Son las 2 PM de un jueves. Tengo mi café, mis auriculares con cancelación de ruido y una consulta SQL que necesita unir cuatro tablas y escupir un informe para las 5 PM. No es gran cosa, verdad?

Famosas últimas palabras.

La Consulta del Infierno

La consulta tenía unas 120 líneas. No era enorme, pero sí robusta. Tenía subconsultas anidadas, un par de CTEs, más JOINs que una boda, y — ahora me doy cuenta — cero formato. Era un muro de texto. Palabras clave en MAYÚSCULAS chocando contra nombres de columna en minúsculas sin espacios, sin sangría, sin piedad.

Esto es básicamente lo que estaba viendo (lo he anonimizado, pero el horror es el mismo):

SELECT a.id, b.name, c.total, (SELECT COUNT(*) FROM orders o WHERE o.user_id = a.id AND o.status = 'active') as order_count FROM users a LEFT JOIN profiles b ON a.id = b.user_id INNER JOIN (SELECT user_id, SUM(amount) as total FROM transactions GROUP BY user_id) c ON a.id = c.user_id WHERE a.created_at > '2025-01-01' AND b.name IS NOT NULL AND (SELECT COUNT(*) FROM orders o WHERE o.user_id = a.id AND o.status = 'pending') > 5;

Te duelen los ojos? Bien. Así es exactamente como me sentí cuando lo escribí. Pero funcionaba. Más o menos.

El Error

El informe devolvió 47 registros. Esperaba unos 1,200. Algo estaba filtrando casi todos mis usuarios, pero no podía descubrir qué. Miré fijamente esa mezcla durante una hora. Añadí comentarios. Lo dividí en partes. Hice SELECT * de cada CTE individualmente. Nada.

En la hora dos, estaba convencido de que la base de datos estaba embrujada. Empecé a murmurar sobre "fantasmas de datos." Mi compañera Sarah me miró de una manera que decía por favor vete a casa.

La Solución

Entonces, por pura desesperación, pegué todo en nuestro formateador SQL. No porque pensara que ayudaría — solo porque quería que la sangría fuera bonita mientras fracasaba.

Y allí estaba. Inmediatamente. A plena vista.

La cláusula AND b.name IS NOT NULL. Estaba dentro del ámbito de la subconsulta para el INNER JOIN, pero no lo había sangrado, así que no vi que estaba excluyendo a todos los usuarios que no tenían un perfil Y un pedido pendiente. Excepto espera — en realidad, debido a la precedencia de operadores con un conjunto de paréntesis faltante, se estaba aplicando al WHERE de una manera que eliminaba tres cuartas partes de mis resultados.

Cinco minutos después de pegarlo en el formateador, tenía el error solucionado. Tres horas de mi vida, desaparecidas. Por falta de un poco de espacio en blanco.

No Seas Como Yo

Sé que el formateo parece un "bonito tenerlo." No lo es. Es como usar el cinturón de seguridad — aburrido hasta que te estrellas. Formatea tu SQL antes de ejecutarlo. No después. Si hubiera formateado esa consulta desde el principio, habría detectado los paréntesis torcidos en unos ocho segundos en lugar de tres horas.

Usa el formateador SQL. Úsalo temprano. Úsalo a menudo. Tu yo de la noche te lo agradecerá — y no terminarás culpando a los fantasmas por tu propio paréntesis faltante.