Postgresql

問題將數據插入連接的表postgresql

  • August 17, 2020

我有 2 個現有表:‘projects’‘units’。這兩個表通過項目 ID 連接。在***“項目”表中,該列稱為“id”,每次插入新項目時都會生成。在“units”***表中,相同的 id 稱為“projekt_id”。

我現在想從名為***’temp_units’的第三個表中添加新項目。該表還包含與表‘units’***相關的資訊。因此,對於“temp_units”表中的每一行,我想在“projects”表中創建一個新行,並units ”中創建一個新行桌子。這兩行應該通過項目 id 連接起來。

我嘗試了以下查詢,但出現錯誤:作為表達式的子查詢返回的不止一行

然後我在某處閱讀了有關添加 Limit = 1 的資訊,因此我將其添加到下面的查詢中(它在此處顯示為註釋)。使用 Limit = 1 程式碼可以工作,但“units”
表中的所有插入數據都連接到***“projects”***表中創建的第一個項目。

目前是這樣的:

項目

id
--
1
2
3

單位

Id | projekt_id 
---------------
1 | 1 
2 | 1 
3 | 1 

但我需要這樣:

項目

id
--
1
2
3

單位

Id | projekt_id 
---------------
1 | 1 
2 | 2 
3 | 3

我正在使用 PostgreSQL 9.5.19。我真的很感激任何幫助

WITH insert_projekte AS
   (
   INSERT INTO projects (name, projekt_status_id, creator_id, editor_id, inserted_at, updated_at)
   SELECT name, projekt_status_id, creator_id, editor_id, inserted_at, updated_at  
   FROM temp_units
   RETURNING ID
   )

INSERT INTO units (kgnr, ez, projekt_id, creator_id, editor_id, inserted_at, updated_at)
SELECT t.kg_ez, t.ez, (SELECT id from insert_projekte/*LIMIT = 1*/), t.creator_id, t.editor_id, t.inserted_at, t.updated_at
FROM temp_units t
RETURNING ID

所以我最終想通了

       WITH insert_projekte AS
           (
           INSERT INTO projects (name, projekt_status_id, creator_id, editor_id, inserted_at, updated_at)
           SELECT name, projekt_status_id, creator_id, editor_id, inserted_at, updated_at  
           FROM temp_units
           RETURNING ID, name
           )
                       
INSERT INTO units (kgnr, ez, projekt_id, creator_id, editor_id, inserted_at, updated_at)
   SELECT t.kg_ez, t.ez, insert_projekte.id, t.creator_id, t.editor_id, t.inserted_at, t.updated_at
   FROM temp_units t
   JOIN insert_projekte on
   insert_projekte.name = t.name
   RETURNING ID

我總是將子查詢留在第二個 INSERT 中,所以它以前從未工作過。

謝謝@CL。對於有用的建議。

引用自:https://dba.stackexchange.com/questions/273821