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.
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) ); 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 |Antes de escribir esta pregunta, he usado como referencia estas publicaciones: a , b , c
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)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;