Przykładowe dane:

Sample Data

Próbuję zaktualizować kolumnę z wartościami z wielu kolumn w innej tabeli, jeśli pasują dwie kolumny.

Rozważmy następujące zapytanie:

UPDATE application_table
SET    asset_list = asset_table.asset_name
FROM   asset_table
WHERE  application_table.application_name = asset_table.applications;

Moja struktura stołu to:

application_table:
"asset_list";         "text[]"
"application_name";   "character varying"

asset_table:
"asset_name";         "character varying"
"applications";       "character varying"

Otrzymuję następujący błąd:

ERROR:  column "asset_list" is of type text[] but expression is of type character varying
Line 12 SET    asset_list = asset_table.asset_name
0
Ohmsy 14 listopad 2018, 16:51

1 odpowiedź

Najlepsza odpowiedź

To, co musisz zrobić, to zagregować asset_name na applications wartość i ustawić asset_list na tę zagregowaną wartość.

Problem w tym, że nie możesz zrobić czegoś takiego

UPDATE ..
SET asset_list = ARRAY_AGG(asset_name)
FROM ...

Ponieważ funkcje agregujące nie są dozwolone w takich aktualizacjach.

Oto dwa inne sposoby na zrobienie tego:

UPDATE app_table
SET asset_list = _asset_list
FROM (
    SELECT applications, ARRAY_AGG(asset_name ORDER BY asset_name) AS _asset_list
    FROM asset_table
    GROUP BY applications
) AS a
WHERE app_name = applications;

https://www.db-fiddle.com/f/pKB5k6Lexwzqv6ZbCCdJay/0

Najpierw tworzy zestaw wyników różnych nazw aplikacji i tablicę wszystkich asset_name dla każdej nazwy aplikacji. Następnie aktualizuje tabelę jak zwykle o tę wartość tablicy.

Innym sposobem jest:

UPDATE app_table
SET asset_list = (SELECT ARRAY_AGG(asset_name ORDER BY asset_name)
                  FROM asset_table
                  WHERE applications = app_name)
;

https://www.db-fiddle.com/f/8oVWsubXW93n142gtZYLXB/0

Spowoduje to zaktualizowanie każdego rekordu w app_table i obliczenie wartości tablicy w locie dla każdego rekordu.

1
404 14 listopad 2018, 22:11