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

352
Views
Postgres: las actualizaciones con join dan resultados incorrectos

Estoy teniendo dificultades para entender lo que estoy haciendo mal. El resultado de esta consulta muestra los mismos resultados para cada fila en lugar de actualizarse con el resultado correcto.

Mis datos

Estoy tratando de actualizar una tabla de estadísticas sobre un conjunto de negocios

 business_stats ( id SERIAL, pk integer not null, b_total integer, PRIMARY KEY(pk) );

los detalles de cada negocio se almacenan aquí

 business_details (id SERIAL, category CHARACTER VARYING, feature_a CHARACTER VARYING, feature_b CHARACTER VARYING, feature_c CHARACTER VARYING );

y aqui una tabla que asocia el pk con la categoria

 datasets (id SERIAL, pk integer not null, category CHARACTER VARYING; PRIMARY KEY(pk) );

Que hice mal)

 UPDATE business_stats SET b_total = agg.total FROM business_stats b, ( SELECT d.pk, count(bd.id) total FROM business_details AS bd INNER JOIN datasets AS d ON bd.category = d.category GROUP BY d.pk ) agg WHERE b.pk = agg.pk;

El resultado de esta consulta es

 | id | pk | b_total | +----+----+-----------+ | 1 | 14 | 273611 | | 2 | 15 | 273611 | | 3 | 16 | 273611 | | 4 | 17 | 273611 |

pero si ejecuto solo SELECT, los resultados de cada paquete son completamente diferentes

 | pk | agg.total | +----+-------------+ | 14 | 273611 | | 15 | 407802 | | 16 | 179996 | | 17 | 815580 |

LA PREGUNTA

  • ¿Por qué está pasando esto?
  • ¿Por qué la cláusula WHERE no funciona?

Antes de escribir esta pregunta, he usado como referencia estas publicaciones: a , b , c

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

Haga lo siguiente (siempre recomiendo no unirse en Actualizaciones)

 UPDATE business_stats bs SET b_total = ( SELECT count(c.id) total FROM business_details AS bd INNER JOIN datasets AS d ON bd.category = d.category where d.pk=bs.pk ) /*optional*/ where exists (SELECT * FROM business_details AS bd INNER JOIN datasets AS d ON bd.category = d.category where d.pk=bs.pk)
over 4 years ago · Santiago Trujillo Report

0

El problema es su cláusula FROM. La referencia repetida a business_stats significa que no está restringiendo la unión como esperaba. Te estás uniendo a agg contra la segunda mención no relacionada de business_stats en lugar de la fila que deseas actualizar.

Algo como esto es lo que buscas ( advertencia no probada):

 UPDATE business_stats AS b SET b_total = agg.total FROM (...) agg WHERE b.pk = agg.pk;
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!