PostgreSQL INSERT INTO在Function中

时间:2015-01-25 02:20:07

标签: sql postgresql select

我得到了表格:

一般

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中的某些数据复制到General表中使用:

    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 ...
               ^

知道为什么这个错误出现在那个简单的查询中?

非常感谢!

2 个答案:

答案 0 :(得分:1)

该表已存在,因此您无需创建它。您想插入 general

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

我不太确定哪些列对应哪些列。您应该明确每个表中的列列表。

答案 1 :(得分: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