PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Gibt Daten aus der in INSERT verwendeten Unterauswahl in einem allgemeinen Tabellenausdruck zurück

Sie müssen Ihre Tabellennamen und Aliase richtig eingeben. Außerdem ist die Verbindung zwischen den beiden Tabellen die Spalte image (data in der neuen Tabelle 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;

Wie in meiner alten Antwort erklärt, auf die Sie verwiesen haben, image muss im task_log eindeutig sein damit das funktioniert:

Ich habe eine Technik hinzugefügt, mit der nicht eindeutige Werte in der referenzierten Antwort disambiguiert werden können. Sie sind sich nicht sicher, ob Sie doppelte Bilder in file_data möchten , obwohl.

In der RETURNING -Klausel eines INSERT Sie können nur auf Spalten aus der eingefügten Zeile verweisen. Das Handbuch:

Fettdruck von mir.

Doppelte Quellwerte falten

Wenn Sie eindeutige Einträge in der Zieltabelle des INSERT wünschen (task_log ), alles, was Sie in diesem Fall brauchen, ist DISTINCT im anfänglichen 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;

Die resultierende file_data.id wird mehrfach in task_log verwendet . Beachten Sie, dass mehrere Zeilen in task_log zeigen Sie nun auf dasselbe Bild in file_data . Vorsicht bei Aktualisierungen und Löschungen ...