2017-07-06 108 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。 –