我有兩個資料庫表。我需要做的是將特定資料從一個存盤復制到另一個,但還要保留到照片的映射。第一部分我可以很容易地寫
INSERT INTO item (storage_id, price, quantity, description, document_id)
SELECT 10, price, quantity, description, document_id
FROM item
WHERE quantity >= 10 AND price <= 100
但之后新插入的專案沒有照片。請注意,該document_id
欄位對于未復制的專案是唯一的。
uj5u.com熱心網友回復:
假設id
列是自動生成的代理主鍵,例如 aserial
或IDENTITY
列。
使用資料修改 CTERETURNING
對每個源表進行一次掃描:
WITH sel AS (
SELECT id, price, quantity, description, document_id
FROM item
WHERE quantity >= 10
AND price <= 100
)
, ins_item AS (
INSERT INTO item
(storage_id, price, quantity, description, document_id)
SELECT 10 , price, quantity, description, document_id
FROM sel
RETURNING id, document_id -- document_id is UNIQUE in this set!
)
INSERT INTO item_photo
(item_id, date, size)
SELECT ii.id , ip.date, ip.size
FROM ins_item ii
JOIN sel s USING (document_id) -- link back to org item.id
JOIN item_photo ip ON ip.item_id = s.id; -- join to org item.id
CTEsel
從 table 中讀取我們需要的所有內容items
。
CTEins_item
插入到表項中。該RETURNING
子句id
與 (unique!) 一起回傳新生成的值,document_id
因此我們可以鏈接回來。
最后,外部INSERT
插入到item_photo
. 我們可以在鏈接回原始后選擇匹配的行item.id
。
有關的:
- 為新字串插入新外鍵行
但:
document_id 欄位對于未復制的專案是唯一的。
這是否保證我們正在處理獨特的document_id
價值觀?
uj5u.com熱心網友回復:
鑒于這document_id
兩組是相同的,我們可以使用它來確保在第一次復制之后,復制所有包含照片的重復條目。
注意:這仍然是一個骯臟的黑客,但它會起作用。理想情況下,通過資料同步,我們確保所有目標表中都有一個
reference
orcommon
鍵。您還可以使用輸出引數來捕獲新值或使用游標或其他回圈結構來逐一處理記錄并同時復制照片,而不是在初始復制階段之后id
嘗試更新照片。
此查詢將為沒有照片但另一個具有相同照片的專案插入照片。 document_id
INSERT INTO item_photo (item_id, "date", size)
SELECT "source_photo".item_id, "source_photo"."date", "source_photo". Size
FROM item "target_item"
INNER JOIN item "source_item" on "target_item".document_id = "source_item".document_id
INNER JOIN item_photo "source_photo" ON "source_item".id = "source_photo".item_id
WHERE "target_item".id <> "source_item".id
AND NOT EXISTS ( SELECT id FROM item_photo WHERE item_id = "target_item".id)
AND source_item.id IN (
SELECT MIN(p.item_id) as "item_id"
FROM item_photo p
INNER JOIN item i ON p.item_id = i.id
GROUP BY document_id
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/506354.html
標籤:sql 数据库 PostgreSQL