sql - 确定路径的子计数

标签 sql postgresql

我有一个表,其“路径”列有值,我想更新表的“child_count”列,以便获得以下输出。

 path   | child_count 
--------+-------------
        |           5
 /a     |           3
 /a/a   |           0
 /a/b   |           1
 /a/b/c |           0
 /b     |           0

我目前的解决方案——效率太低了——使用如下存储过程:

CREATE FUNCTION child_count() RETURNS VOID AS $$
DECLARE
  parent VARCHAR; 
BEGIN   
  FOR parent IN
    SELECT path FROM my_table
  LOOP
    DECLARE
      tokens VARCHAR[] := REGEXP_SPLIT_TO_ARRAY(parent, '/');
      str VARCHAR := '';
    BEGIN
      FOR i IN 2..ARRAY_LENGTH(tokens, 1)
      LOOP
        UPDATE my_table
          SET child_count = child_count + 1
        WHERE path = str;
        str := str || '/' || tokens[i];     
      END LOOP;
    END;    
  END LOOP;
END;
$$ LANGUAGE plpgsql;

有人知道做同样事情的单个 UPDATE 语句吗?

最佳答案

也许像这样的东西可以解决问题:

UPDATE my_table a
   SET child_count = SELECT count(path) FROM my_table b WHERE b.path LIKE a.path || '/%';

关于sql - 确定路径的子计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6436342/

相关文章:

SQL:获取各基金股票的均值

sql - 比较 HIVE 中的两个表

PHP - 如何从查询中获取订单并获取 "place number"

python - 无法使用 psycopg2 在 postgres 中插入无值

sql - Postgres : Ordering result by to_char date field

sql - 架构中不存在类型 "geometry",但扩展名存在

postgresql - 使用日期访问 Postgres 终端历史记录

sql - 删除sql中的重复行

python - 在数据库中存储多个 excel 文件的有效方法?

sql - 如何以 AM/PM 格式显示时间?