Standardowa funkcja agregująca array_agg()
działa tylko dla typów bazowych, a nie typów tablicowych jako danych wejściowych.(Ale Postgres 9.5+ ma nowy wariant array_agg()
to może!)
Możesz użyć niestandardowej funkcji agregującej array_agg_mult()
zgodnie z definicją w tej powiązanej odpowiedzi:
Wybieranie danych do tablicy Postgres
Utwórz go raz na bazę danych. Wtedy Twoje zapytanie może działać tak:
SELECT use.user_sched_id, array_agg(se.sched_entry_id) AS seids
,array_agg_mult(ARRAY[se.min_crew]) AS min_crew_arr
FROM base.sched_entry se
LEFT JOIN base.user_sched_entry use USING (sched_entry_id)
WHERE se.sched_entry_id = ANY(ARRAY[623, 625])
GROUP BY user_sched_id;
W odpowiedzi, do której prowadzi link, znajduje się szczegółowe uzasadnienie.
Rozmiary muszą się zgadzać
W odpowiedzi na Twój komentarz, rozważ ten cytat z podręcznika na temat typów tablic:
Tablice wielowymiarowe muszą mieć pasujące zakresy dla każdego wymiaru. Niezgodność powoduje błąd.
Nie da się tego obejść, typ tablicy nie pozwala na taką niezgodność w Postgresie. możesz uzupełnij swoje tablice wartościami NULL, aby wszystkie wymiary miały pasujące zakresy.
Ale wolałbym przetłumaczyć tablice na listy oddzielone przecinkami za pomocą array_to_string()
na potrzeby tego zapytania i użyj string_agg()
aby zagregować text
- najlepiej z innym separatorem. Używając nowej linii w moim przykładzie:
SELECT use.user_sched_id, array_agg(se.sched_entry_id) AS seids
,string_agg(array_to_string(se.min_crew, ','), E'\n') AS min_crews
FROM ...
Normalizuj
Na początek warto rozważyć normalizację schematu. Zazwyczaj taką relację n:m można zaimplementować z osobną tabelą, jak pokazano w tym przykładzie:
Jak zaimplementować relację wiele-do-wielu w PostgreSQL?