2017-09-07 79 views
0

我的目標是將'Book'表中的每一行(如果它具有非null的publish_date)拆分爲兩個'Book'行,原始行和新使用新的自動遞增的id,新的publish_type,no publish_date(不相關)和相同的isbn。使用PostgreSQL中插入到查詢的ID插入外部記錄

我寫了一條SQL語句來做到這一點,但訣竅是,現在我需要獲取每個新行的id,並根據每個原始書籍的Origin記錄在「Origin」表中創建新的外部記錄 - 我基本上需要複製Origin記錄,以便每個新的Book記錄都映射到Origin表中的正確(原始)country_codes。

/* Here are the tables */ 
Book 
id | publish_date | publish_type | isbn 

Origin 
customer id | country_code 

Country 
id | country_code 

/* First query to split book objects into two */ 
INSERT INTO Book (id, publish_date, publish_type, isbn) 
SELECT NULL, 'Published', isbn 
FROM Book 
WHERE publish_date IS NOT NULL; 

如。

/* Before */ 
Book 
id | publish_date | publish_type | isbn 
1 | 1/1/2000  |    | 123 
2 |    |    | 456 
3 | 2/2/2002  |    | 789 

Origin 
customer id | country_code 
1   | US 
1   | AR 
2   | BR 
3   | MX 

Country 
id | country_code 
5 | US 
6 | AR 
7 | BR 
8 | MX 

/* After */ 
Book 
id | publish_date | publish_type | isbn 
1 | 1/1/2000  |    | 123 
2 |    |    | 456 
3 | 2/2/2002  |    | 789 
4 |    | Published | 123 
5 |    | Published | 789 

Origin 
customer id | country_code 
1   | US 
1   | AR 
2   | BR 
3   | MX 
4   | US 
4   | AR 
5   | MX 

Country 
id | country_code 
5 | US 
6 | AR 
7 | BR 
8 | MX 

好像我需要一些類型的子查詢,或從可使用先前查詢的IDS在外國血統複製語句插入選擇記錄與原始書本行的鍵相關,但我無法識別如何繼續輸入。

+1

複製客戶和國家,因爲你修改了一本書聽起來是錯誤的。 – JGH

+0

你說的沒錯,customer_id實際上應該是book_id。 – Tibberzz

回答

0

如果我理解正確,可以使用CTE。訣竅是使用ISBN來獲得原始origin信息:

with b as (
     INSERT INTO Book (publish_date, publish_type, isbn) 
      SELECT NULL, 'Published', isbn 
      FROM Book 
      WHERE publish_date IS NOT NULL 
      RETURNING * 
    ) 
insert into origin (customer_id, country_code) 
    select b.id, o.country_code 
    from origin o join 
     book 
     on o.customer_id = book.id join 
     b 
     on b.isbn = book.isbn and publish_date is null; 
+0

這是我需要的確切結構,WITH AS和RETURNING *模式。我所需要做的只是在最後調整標準並且工作,謝謝! – Tibberzz