CREATE TABLE objeto ( id_objeto integer NOT NULL, nombre text, CONSTRAINT pk_sustantivo PRIMARY KEY (id_objeto) ); CREATE TABLE etiqueta_objeto ( id_objeto integer NOT NULL, etiqueta text NOT NULL, CONSTRAINT pk_adjetivo PRIMARY KEY (id_objeto, etiqueta), CONSTRAINT fk_etiquetaobjeto_objeto FOREIGN KEY (id_objeto) REFERENCES objeto (id_objeto) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION ); INSERT INTO objeto (id_objeto, nombre) VALUES (1, 'casa'); INSERT INTO objeto (id_objeto, nombre) VALUES (2, 'perro'); INSERT INTO objeto (id_objeto, nombre) VALUES (3, 'carro'); INSERT INTO objeto (id_objeto, nombre) VALUES (4, 'lapiz'); INSERT INTO objeto (id_objeto, nombre) VALUES (5, 'zapato'); INSERT INTO etiqueta_objeto (id_objeto, etiqueta) VALUES (1, 'grande'); INSERT INTO etiqueta_objeto (id_objeto, etiqueta) VALUES (1, 'blanca'); INSERT INTO etiqueta_objeto (id_objeto, etiqueta) VALUES (1, 'vieja'); INSERT INTO etiqueta_objeto (id_objeto, etiqueta) VALUES (2, 'bueno'); INSERT INTO etiqueta_objeto (id_objeto, etiqueta) VALUES (2, 'fiel'); INSERT INTO etiqueta_objeto (id_objeto, etiqueta) VALUES (3, 'viejo'); INSERT INTO etiqueta_objeto (id_objeto, etiqueta) VALUES (3, 'rojo'); INSERT INTO etiqueta_objeto (id_objeto, etiqueta) VALUES (4, 'amarillo'); INSERT INTO etiqueta_objeto (id_objeto, etiqueta) VALUES (4, 'No 2'); INSERT INTO etiqueta_objeto (id_objeto, etiqueta) VALUES (5, 'rojo'); INSERT INTO etiqueta_objeto (id_objeto, etiqueta) VALUES (5, 'derecho'); CREATE OR REPLACE FUNCTION concat(text, text) RETURNS text AS $BODY$ DECLARE t text; BEGIN IF character_length($1) > 0 THEN IF character_length($2) > 0 THEN t = $1 ||', '|| $2; else t = $1; end if; ELSE t = $2; END IF; RETURN t; END; $BODY$ LANGUAGE 'plpgsql' VOLATILE; CREATE AGGREGATE concatena( BASETYPE=text, SFUNC=concat, STYPE=text ); CREATE TABLE objeto ( id_objeto integer NOT NULL, nombre text, CONSTRAINT pk_sustantivo PRIMARY KEY (id_objeto) ); CREATE TABLE etiqueta_objeto ( id_objeto integer NOT NULL, etiqueta text NOT NULL, CONSTRAINT pk_adjetivo PRIMARY KEY (id_objeto, etiqueta), CONSTRAINT fk_etiquetaobjeto_objeto FOREIGN KEY (id_objeto) REFERENCES objeto (id_objeto) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION ); INSERT INTO objeto (id_objeto, nombre) VALUES (1, 'casa'); INSERT INTO objeto (id_objeto, nombre) VALUES (2, 'perro'); INSERT INTO objeto (id_objeto, nombre) VALUES (3, 'carro'); INSERT INTO objeto (id_objeto, nombre) VALUES (4, 'lapiz'); INSERT INTO objeto (id_objeto, nombre) VALUES (5, 'zapato'); INSERT INTO etiqueta_objeto (id_objeto, etiqueta) VALUES (1, 'grande'); INSERT INTO etiqueta_objeto (id_objeto, etiqueta) VALUES (1, 'blanca'); INSERT INTO etiqueta_objeto (id_objeto, etiqueta) VALUES (1, 'vieja'); INSERT INTO etiqueta_objeto (id_objeto, etiqueta) VALUES (2, 'bueno'); INSERT INTO etiqueta_objeto (id_objeto, etiqueta) VALUES (2, 'fiel'); INSERT INTO etiqueta_objeto (id_objeto, etiqueta) VALUES (3, 'viejo'); INSERT INTO etiqueta_objeto (id_objeto, etiqueta) VALUES (3, 'rojo'); INSERT INTO etiqueta_objeto (id_objeto, etiqueta) VALUES (4, 'amarillo'); INSERT INTO etiqueta_objeto (id_objeto, etiqueta) VALUES (4, 'No 2'); INSERT INTO etiqueta_objeto (id_objeto, etiqueta) VALUES (5, 'rojo'); INSERT INTO etiqueta_objeto (id_objeto, etiqueta) VALUES (5, 'derecho'); CREATE OR REPLACE FUNCTION concat(text, text) RETURNS text AS $BODY$ DECLARE t text; BEGIN IF character_length($1) > 0 THEN IF character_length($2) > 0 THEN t = $1 ||', '|| $2; else t = $1; end if; ELSE t = $2; END IF; RETURN t; END; $BODY$ LANGUAGE 'plpgsql' VOLATILE; CREATE AGGREGATE concatena( BASETYPE=text, SFUNC=concat, STYPE=text ); SELECT nombre,concatena(etiqueta) AS etiquetas FROM objeto JOIN etiqueta_objeto USING (id_objeto) GROUP BY nombre ; -- otra función agregada -- Esta agrupa las etiquetas en una columna de tipo arreglo CREATE AGGREGATE array_accum( BASETYPE=anyelement, SFUNC=array_append, STYPE=anyarray, INITCOND='{}' ); SELECT nombre,array_accum(etiqueta) AS etiquetas FROM objeto JOIN etiqueta_objeto USING (id_objeto) GROUP BY nombre ;