PostgreSQL и pl / pgsql SYNTAX для обновления полей на основе SELECT и FUNCTION (while, DISTINCT COUNT) - PullRequest
0 голосов
/ 16 июля 2010

У меня есть большая база данных, и я хочу выполнить некоторую логику для обновления новых полей.

Первичный ключ id для таблицы harvard_assignees

ЛОГИКА ИДЕТ ТАК

  1. Выберите все записи на основе id
  2. Для каждой записи (WHILE), if (state is NOT NULL && country is NULL), update country_out = "US" ELSE update country_out=country

Я вижу шаг 1 как PostgreSQLзапрос и шаг 2 как функция.Просто пытаюсь найти самый простой способ реализовать нативно с точным синтаксисом.

==== Вторая функция немного более интересна, требуя (я полагаю) DISTINCT:

  1. Найти все DISTINCT foreign_keys (двумерный ключ pat_type, патент)
  2. Количество записей, содержащих это значение (например, n = 3 записи имеют fkey "D", "388585")
  3. Обновите эти 3 записи, чтобы идентифицировать процент как 1 / n (например, ОБНОВЛЕНИЕ 3 записей, установите процент = 1/3)

1 Ответ

1 голос
/ 16 июля 2010

Для первого:

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)

Хотя это будет несколько медленным.

Я думаю о решении, основанном на оконных функциях, вы можете также изучить их.

...