【问题标题】:PostgreSQL INSERT INTO within Function [duplicate]函数内的 PostgreSQL INSERT INTO [重复]
【发布时间】:2015-03-23 19:54:24
【问题描述】:

我拿到了桌子:

一般

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)
)

装备

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))

派对

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

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

非常感谢!

【问题讨论】:

  • 你在两个小时前问过同样的问题,那里已经给出了答案。

标签: sql postgresql select


【解决方案1】:

我得到了答案。

我所做的是将来自 Select 查询的值存储在许多变量中,然后我将它们插入到表 General 中,这要归功于开发的函数:

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;  

【讨论】:

    【解决方案2】:

    该表已存在,因此您无需创建它。你想插入general中的行:

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

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

    【讨论】:

      猜你喜欢
      • 2014-03-22
      • 2021-04-05
      • 1970-01-01
      • 1970-01-01
      • 2021-11-19
      • 2012-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多