如何组合pl / pgsql函数中返回视图行类型集的特定行?

时间:2011-08-26 10:14:15

标签: sql database postgresql plpgsql

我有一个视图,我有一个从该视图返回记录的函数。 这是视图定义:

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 引用表标签,即对另一个表 concepts 的引用,而这些表又引用了表表达式的。 以下是表格定义:

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 的行,并且具有相等的列 equiv_r_id 以便这些行只合并一次,合并的行有一个(无关紧要)的id,列 descr 的值是从值连接起来的要组合的行,而行 freq 包含要组合的行的值的总和。我不知道该怎么做,任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

基本上,你所描述的内容如下:

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到目前为止,函数包装器不是必需的。
  • string_agg()需要PostgreSQL 9.0+。否则你必须用

    代替

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

  • 唯一不明确的部分是:

      

    并且引用表概念的行,其具有相等的值equiv_r_id,以便这些行仅组合一次

Waht列恰好指的是表concepts中的哪一列?
concepts.equiv_r_id等于究竟是什么?

如果您可以澄清该部分,我可以将其纳入解决方案。