sql >> Databáze >  >> RDS >> PostgreSQL

Vrátí data z dílčího výběru použitého v INSERT ve společném tabulkovém výrazu

Musíte mít správné názvy a aliasy tabulek. Navíc spojením mezi dvěma tabulkami je sloupec image (data v nové tabulce 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;

Jak je vysvětleno v mé staré odpovědi, na kterou jste odkazovali, image musí být jedinečné v task_log aby to fungovalo:

Přidal jsem techniku, jak v odkazované odpovědi rozdělit nejedinečné hodnoty. Nejste si jisti, zda chcete duplicitní obrázky v file_data , ačkoli.

V RETURNING klauzule INSERT můžete odkazovat pouze na sloupce z vloženého řádku. Příručka:

Odvážný důraz můj.

Složit duplicitní zdrojové hodnoty

Pokud chcete odlišné položky v cílové tabulce INSERT (task_log ), vše, co v tomto případě potřebujete, je DISTINCT v počátečním 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;

Výsledný file_data.id se v task_log používá několikrát . Uvědomte si, že více řádků v task_log nyní ukažte na stejný obrázek v file_data . Opatrně s aktualizacemi a mazáním ...



  1. Jak porovnat dvě tabulky v postgresu

  2. MySql REGEXP, aby odpovídal dvěma řetězcům odděleným čárkou

  3. Dva příkazy PLSQL se začátkem a koncem, běží dobře samostatně, ale ne společně?

  4. pomocí Oracle Loader k importu dat HBase do tabulky Oracle