sql >> Databasteknik >  >> RDS >> PostgreSQL

Returnera data från underval som används i INSERT i ett gemensamt tabelluttryck

Du måste få rätt tabellnamn och alias. Dessutom är kopplingen mellan de två tabellerna kolumnen image (data i den nya tabellen file_data ):

WITH inserted AS (
  INSERT INTO file_data (data)
  SELECT image
  FROM   task_log
  WHERE  image IS NOT NULL
  RETURNING id, data  -- can only reference target row
)
UPDATE task_log t
SET    attachment_id = i.id
     , attachment_type = 'INLINE_IMAGE'
FROM   inserted i
WHERE  t.image = i.data;

Som förklaras i mitt gamla svar du refererade till, image måste vara unik i task_log för att detta ska fungera:

Jag lade till en teknik för att disambiguera icke-unika värden i det refererade svaret. Inte säker på om du vill ha dubbletter av bilder i file_data dock.

I RETURNING sats av en INSERT du kan bara referera till kolumner från den infogade raden. Handboken:

Djärv betoning min.

Vik dubbletter av källvärden

Om du vill ha distinkta poster i måltabellen för INSERT (task_log ), allt du behöver i det här fallet är DISTINCT i den initiala SELECT :

WITH inserted AS (
  INSERT INTO file_data (data)
  SELECT DISTINCT image  -- fold duplicates
  FROM   task_log
  WHERE  image IS NOT NULL
  RETURNING id, data  -- can only reference target row
)
UPDATE task_log t
SET    attachment_id = i.id
     , attachment_type = 'INLINE_IMAGE'
FROM   inserted i
WHERE  t.image = i.data;

Den resulterande file_data.id används flera gånger i task_log . Tänk på att flera rader i task_log peka nu på samma bild i file_data . Var försiktig med uppdateringar och borttagningar ...



  1. PostgreSQL:Hitta behörighet för element, gå upp till root

  2. Öka hastigheten på MySQL LIKE-frågan?

  3. Hur man konverterar SDO_GEOMTRY i GeoJSON

  4. Yii2 Hur utför man var OCH eller ELLER villkorsgruppering?