2015-01-25 2 views
-2

Я получил таблицы:PostgreSQL INSERT INTO в функции

Общие

CREATE TABLE general 
(
    equipo character varying(30) NOT NULL, 
    partidos_jug integer, 
    partidos_gana integer, 
    partidos_emp integer, 
    partidos_perd integer, 
    puntos integer, 
    goles_favor integer, 
    CONSTRAINT general_pkey PRIMARY KEY (equipo) 
) 

Equipos

create table equipos 
(num_eqpo serial,  
ciudad varchar (30), 
num_gpo int, 
nom_equipo varchar (30), 
primary key (num_eqpo), 
foreign key (num_gpo) references grupos (num_gpo)) 

Partidos

create table partidos 
(semana int, 
num_eqpo_loc int, 
num_eqpo_vis int, 
goles_loc int, 
goles_vis int, primary key (semana,num_eqpo_loc,num_eqpo_vis), 
foreign key (num_eqpo_loc) references equipos (num_eqpo), 
foreign key (num_eqpo_vis) references equipos (num_eqpo)) 

Я хочу, чтобы скопировать некоторые данные из таблицы Equipos к таблице Ge нераля с помощью:

CREATE OR REPLACE FUNCTION sp_tablageneral() RETURNS void AS $$ 

DECLARE cont int:= (SELECT count(num_eqpo)FROM equipos); 
BEGIN 

    while cont>0 
    LOOP 

      INSERT INTO general(equipo,partidos_jug) 
      SELECT nom_equipo, COUNT(*) FROM equipos E, partidos as P 
      WHERE E.num_eqpo = cont AND (P.num_eqpo_loc=cont OR P.num_eqpo_vis=cont);   

     cont:= cont - 1; 
     END LOOP; 

RETURN; 
END; 
$$ LANGUAGE plpgsql; 

Я имел эту функцию, отделенную в небольших блоках коды:

INSERT INTO general(equipo) 
SELECT nom_equipo FROM equipos E 
WHERE E.num_eqpo = 1; 

SELECT COUNT(*) FROM partidos as P WHERE (P.num_eqpo_loc=1 OR P.num_eqpo_vis=1) 

Я хочу, чтобы скопировать всю информацию из всех записей, а не только первый.

Используя эту функцию, я получаю эту ошибку:

ERROR: the "e.nom_equipo" column must appear in the GROUP BY clause or be used in an aggregate function 
LINE 2: SELECT nom_equipo, COUNT (*) FROM equipos E, partid ... 
               ^ 

Любую идею, почему появляется эта ошибка в этом простом запросе?

Большое спасибо!

+1

Вы задал этот же вопрос два часа назад, и там был дан ответ. – Patrick

ответ

1

Стол уже существует, поэтому его не нужно создавать. Вы хотите вставки строки в general:

INSERT INTO general(col1, col2, . . .) 
    SELECT col1, col2, . .. 
    FROM equipos E 
    WHERE E.num_eqpo = 2; 

Я не совсем уверен, что столбцы соответствуют каким. Вы должны четко указывать списки столбцов из каждой таблицы.

0

У меня есть ответ.

То, что я сделал для хранения во многих переменных значения из запросов на выборку, а затем я вставил их в таблицу общих благодаря функции развитом:

CREATE OR REPLACE FUNCTION sp_tablageneral() RETURNS void AS $$ 
DECLARE 
cont int:= (SELECT count(num_eqpo)FROM equipos); 
jugados int; 
ganados int; 
empatados int; 
perdidos int; 
pts int; 
favor int; 

BEGIN 
    while cont>0 
    LOOP 

    jugados:=(SELECT COUNT(*) FROM partidos as P WHERE (P.num_eqpo_loc=cont OR P.num_eqpo_vis=cont));  
    ganados:=(SELECT COUNT(*) FROM partidos AS P WHERE (P.num_eqpo_loc=cont AND P.goles_loc>P.goles_vis OR P.num_eqpo_vis=cont AND P.goles_vis>P.goles_loc)); 
    empatados:=(SELECT COUNT(*) FROM partidos AS P WHERE (P.num_eqpo_loc=cont AND P.goles_loc=P.goles_vis OR P.num_eqpo_vis=cont AND P.goles_loc=P.goles_vis)); 
    perdidos:=(SELECT COUNT(*) FROM partidos as P WHERE ((P.num_eqpo_loc=cont AND P.goles_loc<P.goles_vis) OR (P.num_eqpo_vis=cont AND P.goles_loc>P.goles_vis))); 
    pts:=empatados*1 + ganados*3; 
    favor:=(SELECT SUM(goles_loc) FROM partidos as P WHERE P.num_eqpo_loc=cont + (SELECT SUM(goles_vis) FROM partidos as P WHERE P.num_eqpo_vis=cont)); 

    INSERT INTO general(equipo,partidos_jug,partidos_gana,partidos_emp,partidos_perd,puntos,goles_favor) 
    SELECT nom_equipo,jugados,ganados,empatados,perdidos,pts,favor FROM equipos E 
    WHERE E.num_eqpo = cont;   

    cont:= cont - 1; 
    END LOOP; 

RETURN; 
END; 
$$ LANGUAGE plpgsql; 

Evidencia

Смежные вопросы