2017-03-16 91 views
0

我與PostgreSQL的工作,我的SQL結構:插入許多行,另一個表中返回的ID和更新IDS

CREATE TEMP TABLE users (
    id_user serial, 
    user_name varchar, 
    id_user_description int 
); 

CREATE TEMP TABLE user_description (
    id_user_description serial, 
    age int 
); 

users表有部分用戶

INSERT INTO users (user_name) 
SELECT column1 
FROM (
    VALUES 
    ('John'), 
    ('Amanda') 
) t; 

我試圖插入數據到表user_description,我也需要將插入的行ID更新到表users。我的查詢是這樣的:

WITH inserted_user_description AS (
    INSERT INTO user_description (age) 
    SELECT age 
    FROM (
     SELECT users.id_user, 
      t.column1 AS age, 
      t.column2 AS user_name 
     FROM (
      VALUES 
      (21, 'John'), 
      (28, 'Amanda') 
     ) t 
     INNER JOIN users ON users.user_name = t.column2 
    ) tt 
    RETURNING id_user_description, tt.id_user 
) 
UPDATE users SET id_user_description = t.id_user_description 
FROM (
    SELECT id_user_description, id_user 
    FROM inserted_user_description 
) t 
WHERE users.id_user = t.id_user; 

,但我得到的錯誤:

ERROR: missing FROM-clause entry for table "tt" LINE 15: RETURNING id_user_description, tt.id_user

我怎麼能解決這個問題?

+0

錯誤m essage與發帖碼不匹配 –

+0

你是什麼意思?爲什麼不?當然,你應該刪除<...>,我刪除多個列 – Jobs

+0

把原來的SQL和錯誤,如果你想幫助 –

回答

0

下面是說明它是如何工作的一個有效的SQL片段。你有兩個表ab。當您在a中插入行時,您想要更新b

ab模式:

CREATE TABLE a (
    id serial unique, 
    some_int int 
); 

CREATE TABLE b (
    id serial, 
    a_id int, 
    some_date timestamp 
); 

讓我們插入一些行到b相匹配,我們將在a插入的人(他們是行,我們將更新):

INSERT INTO b (a_id, some_date) 
SELECT generate_series, null 
FROM generate_series(1, 100); 

現在,這裏是如何在ab插入行和更新等同行:

WITH inserted as (
    INSERT INTO a (some_int) 
    SELECT * 
    FROM generate_series(1, 10) 
    RETURNING id 
) 
UPDATE b 
SET some_date = NOW() 
FROM inserted i 
WHERE i.id = b.a_id 
; 

正如你可以看到,10行,其中插入a並在更新b 10個相當於行:

test=# SELECT * FROM a; 
id | some_int 
----+---------- 
    1 |  1 
    2 |  2 
    3 |  3 
    4 |  4 
    5 |  5 
    6 |  6 
    7 |  7 
    8 |  8 
    9 |  9 
10 |  10 
(10 rows) 

test=# SELECT * FROM b WHERE some_date IS NOT NULL; 
id | a_id |   some_date   
----+------+---------------------------- 
    1 | 1 | 2017-03-16 17:48:32.257217 
    2 | 2 | 2017-03-16 17:48:32.257217 
    3 | 3 | 2017-03-16 17:48:32.257217 
    4 | 4 | 2017-03-16 17:48:32.257217 
    5 | 5 | 2017-03-16 17:48:32.257217 
    6 | 6 | 2017-03-16 17:48:32.257217 
    7 | 7 | 2017-03-16 17:48:32.257217 
    8 | 8 | 2017-03-16 17:48:32.257217 
    9 | 9 | 2017-03-16 17:48:32.257217 
10 | 10 | 2017-03-16 17:48:32.257217 
(10 rows) 

更新:

在特定情況下,這是什麼,我相信您的查詢應該看起來像(總是很難在沒有架構的情況下編寫查詢!):

WITH inserted_user_description AS (
    INSERT INTO user_description (age, <...>) 
    SELECT u.id_user, 
     t.column1 AS age, 
     <...> 
     t.column8 AS user_name 
    FROM (
     VALUES 
     (21, <...> ,'John'), 
     (28, <...> ,'Amanda'), 
     <...> 
    ) t 
    JOIN users u ON u.user_name = t.user_name 
    RETURNING id_user_description, u.id_user 
) 
UPDATE users 
SET id_user_description = t.id_user_description 
FROM inserted_user_description t 
WHERE users.id_user = t.id_user; 
+0

你的第一個例子是我的情況下,b.id和b.a_id在我的情況可不同不同。 – Jobs

+0

至於更新。我有錯誤:插入有比目標列更多的表達式 – Jobs

+0

我已更新具體案例模式的問題 – Jobs

相關問題