sql >> Database teknologi >  >> RDS >> PostgreSQL

Returner data fra undervalg brugt i INSERT i et fælles tabeludtryk

Du skal have dine tabelnavne og aliasser rigtige. Plus, forbindelsen mellem de to tabeller er kolonnen image (data i den nye 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;

Som forklaret i mit gamle svar, du refererede til, image skal være unik i task_log for at dette virker:

Jeg tilføjede en teknik til, hvordan man disambiguerer ikke-unikke værdier i det refererede svar. Ikke sikker på, om du vil have dublerede billeder i file_data dog.

I RETURNING klausul af en INSERT du kan kun referere til kolonner fra den indsatte række. Manualen:

Fed fremhævelse mine.

Fold dublerede kildeværdier

Hvis du ønsker adskilte poster i måltabellen for INSERT (task_log ), alt hvad du behøver i dette tilfælde er DISTINCT i den indledende 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 resulterende file_data.id bruges flere gange i task_log . Vær opmærksom på, at flere rækker i task_log peg nu på det samme billede i file_data . Forsigtig med opdateringer og sletninger ...



  1. Mac psql/readline - bibliotek ikke indlæst

  2. Oracle vælger data efter sammenhængende datoblokke

  3. Afkrydsningsfelt med Array inde i looping Falskt resultat?

  4. MySQL fra_unixtime efter 2038-01-19?