Przykładowe dane:
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
1 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.
Podobne pytania
Nowe pytania
postgresql
PostgreSQL to system zarządzania relacyjnymi bazami danych typu open source (RDBMS) dostępny dla wszystkich głównych platform, w tym Linux, UNIX, Windows i OS X. Podczas zadawania pytań prosimy o podanie swojej wersji Postgres. Pytania dotyczące administracji lub zaawansowanych funkcji najlepiej kierować na dba.stackexchange.com.