PostgreSQL和pl / pgsql语法基于SELECT和FUNCTION更新字段(while循环,DISTINCT COUNT)

时间:2010-07-16 11:51:24

标签: postgresql plpgsql

我有一个大型数据库,我想做一些逻辑来更新新字段。

表harvard_assignees

的主键是id

LOGIC就像这样

  1. 根据id
  2. 选择所有记录
  3. 对于每条记录(WHILE),if (state is NOT NULL && country is NULL), update country_out = "US" ELSE update country_out=country
  4. 我将第1步视为PostgreSQL查询,将第2步视为函数。只是试图找出使用确切语法本地实现的最简单方法。

    ==== 第二个功能更有趣,需要(我相信)DISTINCT

    1. 查找所有DISTINCT foreign_keys(pat_type的双变量密钥,专利)
    2. 计算包含该值的记录(例如,n = 3条记录包含fkey“D”,“388585”)
    3. 更新这3条记录,将百分比标识为1 / n(例如,更新3条记录,设置百分比= 1/3)

1 个答案:

答案 0 :(得分:1)

第一个:

UPDATE
     harvard_assignees
SET
    country_out = (CASE
                      WHEN (state is NOT NULL AND country is NULL) THEN 'US'
                      ELSE country
                  END);

首先它有条件“id = ...”但我删除了它,因为我相信你真的想要更新所有记录。

第二个:

UPDATE           
    example_table
SET              
    percent = (SELECT 1/cnt FROM (SELECT count(*) AS cnt FROM example_table AS x WHERE x.fn_key_1 = example_table.fn_key_1 AND x.fn_key_2 = example_table.fn_key_2) AS tmp WHERE cnt > 0)

那个人会有点慢。

我正在考虑基于窗口函数的解决方案,您可能也想探索它们。