PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Zwróć dane z podselekcji użytej w INSERT we wspólnym wyrażeniu tabelowym

Musisz mieć prawidłowe nazwy tabel i aliasy. Dodatkowo połączenie między dwiema tabelami to kolumna image (data w nowej tabeli 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 wyjaśniono w mojej starej odpowiedzi, do której się odwołujesz, image musi być unikalny w task_log aby to zadziałało:

Dodałem technikę, jak odróżnić nieunikalne wartości w przywołanej odpowiedzi. Nie jestem pewien, czy chcesz zduplikować obrazy w file_data jednak.

W RETURNING klauzula INSERT możesz odwoływać się tylko do kolumn z wstawionego wiersza. Podręcznik:

Pogrubiony nacisk na moje.

Zwiń zduplikowane wartości źródłowe

Jeśli chcesz mieć różne wpisy w tabeli docelowej INSERT (task_log ), wszystko czego potrzebujesz w tym przypadku to DISTINCT w początkowym 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;

Wynikowy file_data.id jest używany wielokrotnie w task_log . Pamiętaj, że wiele wierszy w task_log teraz wskaż ten sam obrazek w file_data . Ostrożnie z aktualizacjami i usuwaniem ...



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgresql i PHP:czy currval jest skutecznym sposobem na odzyskanie ostatniego wstawionego identyfikatora wiersza w aplikacji dla wielu użytkowników?

  2. sql - grupuj według zakresów, aby uwzględnić zakresy bez wartości

  3. UPSERT w PostgreSQL przy użyciu jOOQ

  4. Usuń duplikat z tabeli

  5. Jak skonfigurować źródło danych SSL Spring/Heroku/postgres?