我有一个视图,我有一个从该视图返回记录的函数。 这是视图定义:
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 包含要组合的行的值的总和。我不知道该怎么做,任何帮助将不胜感激。
答案 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;
string_agg()
需要PostgreSQL 9.0+。否则你必须用
array_to_string(array_agg(c.descr),',')
唯一不明确的部分是:
并且引用表概念的行,其具有相等的值equiv_r_id,以便这些行仅组合一次
Waht列恰好指的是表concepts
中的哪一列?
concepts.equiv_r_id
等于究竟是什么?
如果您可以澄清该部分,我可以将其纳入解决方案。