2015-12-29 51 views
0

我正在使用Postgresql,并且使用count的代价很高。我试图做的是计数一个表ID在另一个和更新计数的数字。 比方说第一个表是类迭代通过一个表来更新sql上的另一个表格

ID

num_count

其他表是餐馆

ID

CATEGORY_ID

我想根据Restaurants.category_id的计数值更新categories.num_count。 我可以做到这一点 Update Categories set Categories.num_count = (select count(*) from Restaurants where Restaurants.category_id = Categories.id) 但它花费了太多的时间。我试图做迭代餐馆1次,并更新Categories.num_count ++,但我做不到正确,因为它使每个类别num_count 1。它执行后1停止工作。

有没有更好的方式来做到这一点与SQL?

+0

更好的方法是不要这样做 - 使用视图,或者在需要时计算计数。存储* derived *数据的方法存在问题,即维护它。 – Bohemian

+0

你是对的,但它已经是数据库的快照,不会有添加或删除。我仍然可以尝试使用视图。谢谢你的建议。 – mbaydar

回答

1
update categories c 
set num_count = r.num_count 
from (
    select category_id, count(*) as num_count 
    from restaurants 
    group by category_id 
) r 
where c.id = r.category_id 
+0

我无法理解为什么它的工作速度如此之快,因为在这个sql中仍然有数量。这是因为小组? – mbaydar

+0

@mbaydar它一次统计所有数字 –

1

如何:

with countPerCategory (categoryId, numCount) as 
{ 
    select category_id, count(*) from Restaurants 
    group by category_id 
} 
update Categories set num_count = countPerCategory.numCount 
from countPerCategory 
where Categories.id = countPerCategory.categoryId; 

PS:我觉得做不必要的事情。无论何时添加或删除餐厅,您都需要更新num_count。

+0

你是对的,但它已经是数据库的快照了,不会有添加或删除。 – mbaydar

相关问题