sql >> Database >  >> RDS >> PostgreSQL

Retourneer gegevens van subselect gebruikt in INSERT in een Common Table Expression

U moet uw tabelnamen en aliassen juist hebben. Bovendien is de verbinding tussen de twee tabellen de kolom image (data in de nieuwe tabel 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;

Zoals uitgelegd in mijn oude antwoord waarnaar je verwees, image moet uniek zijn in task_log om dit te laten werken:

Ik heb een techniek toegevoegd voor het ondubbelzinnig maken van niet-unieke waarden in het antwoord waarnaar wordt verwezen. Ik weet niet zeker of je dubbele afbeeldingen in file_data wilt hebben , hoewel.

In de RETURNING clausule van een INSERT u kunt alleen naar kolommen verwijzen vanuit de ingevoegde rij. De handleiding:

Vetgedrukte nadruk van mij.

Dubbele bronwaarden vouwen

Als u afzonderlijke vermeldingen wilt in de doeltabel van de INSERT (task_log ), alles wat je in dit geval nodig hebt is DISTINCT in de eerste 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;

De resulterende file_data.id wordt meerdere keren gebruikt in task_log . Houd er rekening mee dat meerdere rijen in task_log wijs nu naar dezelfde afbeelding in file_data . Voorzichtig met updates en verwijderingen ...



  1. Hoe MySQL-ruimte controleren?

  2. Gebruikers identificeren met een neerwaartse trend SQL

  3. commit na selectie

  4. Django Combineert __unaccent en __search zoekopdrachten