Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

158
Views
La columna agregada de CTE no se puede usar en la cláusula WHERE en la consulta en PostgreSQL

Mi consulta sigue esta estructura:

 WITH CTE AS ( SELECT t1.x, COUNT(t1.y) AS count FROM table1 t1 GROUP BY t1.x ) SELECT CTE.x, CTE.count AS newCount, t2.count AS oldCount FROM table2 t2 JOIN CTE ON t2.x = CTE.x WHERE t2.count != CTE.count;

Me sale el siguiente error: [42803] ERROR: aggregate functions are not allowed in WHERE

Parece que CTE.count es el agregado que desencadena este error. ¿No se supone que los CTE se calculan antes de la consulta principal? ¿Cómo reescribir la consulta para evitar esto?

PostgreSQL 13.2 en x86_64-pc-linux-gnu, compilado por gcc (GCC) 8.3.1 20191121 (Red Hat 8.3.1-5), 64 bits

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

Parece que es el "t2.count" lo que causa el problema.

En dbfiddle puedo reproducir el problema SOLAMENTE cuando no hay una columna llamada "recuento" en la tabla 2.

En otras palabras, el error ocurre solo cuando la tabla 2 se define así:

 create table table2 (x int, y int);

Sin embargo, si agregué la columna "recuento", el error desapareció

 create table table2 (x int, y int, count int);

Creo que cuando no existe tal columna, postgres maneja "contar" como una función agregada y arroja el error.

Entonces, mi solución sería verificar si dicha columna está presente y nunca usar palabras clave conservadas como nombres de columna

over 4 years ago · Santiago Trujillo Report

0

El t2.count se interpreta como una función COUNT() agregada , y su tabla t2 no tiene una columna llamada count .

Asegúrese de que su tabla realmente tenga una columna de count , o asegúrese de calcular su conteo agregado en otro CTE antes de unirse, y luego compare los resultados. También evite usar el alias "count", como el siguiente:

 WITH CTE AS ( SELECT t1.x, COUNT(t1.y) AS total FROM table1 t1 GROUP BY t1.x ), CTE2 AS ( SELECT t2.x, COUNT(t2.y) AS total FROM table2 t2 GROUP BY t2.x ) SELECT CTE1.x, CTE1.total AS newCount, CTE2.total AS oldCount FROM CTE2 JOIN CTE1 ON CTE2.x = CTE1.x WHERE CTE2.total != CTE1.total;
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!