Как объединить определенные строки в функции pl / pgsql, которая возвращает набор типов строк представления? - PullRequest
1 голос
/ 26 августа 2011

У меня есть представление, и у меня есть функция, которая возвращает записи из этого представления. Вот определение вида:

CREATE VIEW ctags(id, name, descr, freq) AS                               
SELECT tags.conc_id, expressions.name, concepts.descr, tags.freq                 
  FROM tags, concepts, expressions
 WHERE concepts.id = tags.conc_id
   AND expressions.id = concepts.expr_id;

Столбец id ссылается на таблицу теги , что указывает на другую таблицу понятия , которая, в свою очередь, ссылается на таблицу выражения . Вот определения таблицы:

CREATE TABLE expressions(
    id              serial PRIMARY KEY,
    name            text,
    is_dropped      bool DEFAULT FALSE,
    rank            float(53) DEFAULT 0,
    state           text DEFAULT 'never edited',
    UNIQUE(name)
);

CREATE TABLE concepts(
    id              serial PRIMARY KEY,
    expr_id         int NOT NULL,
    descr           text NOT NULL,
    source_id       int,
    equiv_p_id      int,
    equiv_r_id      int,
    equiv_len       int,
    weight          int,
    is_dropped      bool DEFAULT FALSE,
    FOREIGN KEY(expr_id) REFERENCES expressions,
    FOREIGN KEY(source_id),
    FOREIGN KEY(equiv_p_id) REFERENCES concepts,
    FOREIGN KEY(equiv_r_id) REFERENCES concepts,
    UNIQUE(id,equiv_p_id),
    UNIQUE(id,equiv_r_id)
);

CREATE TABLE tags(
    conc_id         int NOT NULL,
    freq            int NOT NULL default 0,                                   
    UNIQUE(conc_id, freq)                                                      
);

Таблица выражений также ссылается на мой взгляд (ctags). Я хочу, чтобы моя функция объединила строки моего представления, которые имеют равные значения в столбце name и которые ссылаются на строки таблицы concepts с равными значениями столбца экв_r_id , так что эти строки объединяются только один раз, объединенная строка имеет один (неважно, какой) из идентификаторов, значение столбца descr объединяется из значений объединяемых строк и строка freq содержит сумму значений из строк, которые объединяются. Я понятия не имею, как это сделать, любая помощь будет оценена.

1 Ответ

1 голос
/ 05 октября 2011

По сути, то, что вы описываете, выглядит следующим образом:

CREATE FUNCTION f_test()
  RETURNS TABLE(min_id int, name text, all_descr text, sum_freq int) AS
$x$
SELECT min(t.conc_id) -- AS min_id
      ,e.name
      ,string_agg(c.descr, ', ') -- AS all_descr
      ,sum(t.freq) -- AS sum_freq
  FROM tags t
  JOIN concepts c USING (id)
  JOIN expressions e ON e.id = c.expr_id;
-- WHERE e.name IS DISTINCT FROM
$x$
  LANGUAGE sql;

Основные моменты:

  • Я полностью проигнорировал представление ctags, поскольку оно не нужно.
  • Вы также можете написать это как View до сих пор, обертка функции не требуется.
  • Вам необходим PostgreSQL 9.0+ для string_agg().Иначе вы должны заменить на

    array_to_string (array_agg (c.descr), ',')

  • Единственная неясная часть это:

    и относятся к строкам концепций таблицы с одинаковыми значениями столбца equ_r_id, так что эти строки объединяются только один раз

В столбце Waht точно указывается, какой столбец вtable concepts?
concepts.equiv_r_id равно чему точно?

Если вы сможете уточнить эту часть, я мог бы включить ее в решение.

...