2017-07-06 61 views
0

我有这样的一个表:多次插入WITH/CTE

CREATE TABLE mytable 
(
    col1 character varying(50), 
    mydate timestamp without time zone 
); 

我希望将数据插入到这个表,也是我想最大的ID从我的源存储:

insert into mytable (select myid, col1, mydate from sourcetable); 

我在mytable中没有myid列,后来我不能再问这样的问题:select max(myid) from sourcetable,因为我得到一个快照,而sourcetable是一个事务表(每秒有数百个新记录),所以我需要从该快照中获取最大ID

我想是这样的:

with query1 as (select myid, col1, mydate from sourcetable), 
query2 as (select max(myid) id from query1) 
insert into mytable (select co1, mydate from query1); 
update anothertable set value=(select myid from query2) where col2='avalue'; 

但我得到这个错误:

ERROR: relation "query2" does not exist 
LINE 1: update anothertable set value=(select myid from query2) wher... 

有没有办法解决这个问题的方法吗?

+0

更改秒*带*为逗号:'与QUERY2如...' - >>',QUERY2如...' – joop

+0

@joop查询是没有“与QUERY2作为“首先。我的错。我将编辑问题 –

+0

'... 1,从query1开始计算);'在''后面''两个CTE已经超出了范围。 (他们只在当前声明中有效) – joop

回答

1

问题是,你有两个查询CTE后的。只有一个。 CTE连接到查询。所以,只需添加另一个CTE。事情是这样的:

with query1 as (
     select myid, col1, mydate 
     from sourcetable 
    ), 
    query2 as (
     select max(myid) as id 
     from query1 
    ), 
    i as (
     insert into mytable -- You should really list the columns here 
      select co1, mydate 
      from query1 
    ) 
update anothertable 
    set value = (select myid from query2) 
    where col2 = 'avalue'; 
+1

看起来像一个恶意downvoter。 –

+0

顺便说一句,如何使它与MS SQL Server 2017一起工作?根据文档,“CTE_query_definition指定了一个SELECT语句”。所以它不能包含INSERT。我需要做的是有一堆行,每一个循环步骤将INSERT插入两个表中。只有游标? :( – Alexander

+0

@Alexander ...如果您有关于SQL Server的问题,请提出另一个问题,这个答案只适用于Postgres。 –