子查询

时间:2017-01-29 03:01:25

标签: sql postgresql plpgsql

我有2张桌子。表1和表2。只填充表1,然后通过触发器填充table2的值。

所以,我有这样的触发器,

CREATE OR REPLACE FUNCTION function_copy() RETURNS TRIGGER AS                                                                                                                                  
$BODY$                                                                                                                                                                                         
BEGIN                                                                                                                                                                                          
  INSERT INTO table2 (name) values ((select unnest(xpath('/attendee/bio/name/text()',data)) from table1));                                                                                    

  RETURN new;                                                                                                                                                                                  
END;                                                                                                                                                                                           
$BODY$                                                                                                                                                                                         
language plpgsql;        

触发功能

CREATE TRIGGER trig_copy                                                                                                                                                                       
AFTER INSERT ON table1                                                                                                                                                                       
FOR EACH ROW                                                                                                                                                                                   
  EXECUTE PROCEDURE function_copy();        

因此,当我向table1中插入多于一行时,我不断收到此错误

  

错误:用作表达式

的子查询返回多行

2 个答案:

答案 0 :(得分:3)

不要使用lsvRequestParameters.Sorting = SortOrder.Ascending; 。使用insert . . . values

insert . . . select

INSERT INTO table2 (name) select unnest(xpath('/attendee/bio/name/text()', data)) from table1; 子句假定只有一个值。您的查询表明要插入多行。

答案 1 :(得分:2)

带有set-returns函数的

@Gordon addresses your immediate SQL error。但整个方法都严重受损。您为每个插入的行处理整个表,这会创建一个稳定增加的重复流。 您稍后评论了如何修复冗余插入:

  

TRUNCATE TABLE2; INSERT INTO table2(name)...

有点......有创意。 :)但 。仅处理单个插入的行。 special variable NEW正是出于此目的:

CREATE OR REPLACE FUNCTION function_copy()
  RETURNS trigger AS
$func$
BEGIN
  INSERT INTO table2 (name)
  SELECT *
  FROM   unnest(xpath('/attendee/bio/name/text()', NEW.data))

  RETURN NULL;  -- irrelevant for AFTER trigger
END
$func$ LANGUAGE plpgsql;