我得到了表格:
一般
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 ...
^
知道为什么这个错误出现在那个简单的查询中?
非常感谢!
答案 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;