Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / join и вычисление массива через array(select... ) / 3 сообщений из 3, страница 1 из 1
12.11.2008, 15:32
    #35649479
tadmin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
join и вычисление массива через array(select... )
есть запрос, которым я получаю двумерный массив обычным селектом и разбором строки:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
         select (replace(
         array (    select string_to_array(
		SA.SaleArticleID::text			|| '|' ||
		coalesce(ATS.Name,A.Code)::text          || '|' ||
		coalesce(TR.Amount, 0 )::text      	|| '|' ||
		coalesce(TR.AmountFree, 0 )::text  	|| '|' ||
		coalesce(TRIT.Amount, 0 )::text    	|| '|' ||
		coalesce(TRIT.AmountFree, 0 )::text
		, '|')::text
            from  Articles as A
            inner join TotalRestsNew as TR on (A.ArticleID = TR.ArticleID and TR.StoreGroupID= 5 ) --AAM+
            inner join TotalRestsNew as TRIT on (A.ArticleID = TRIT.ArticleID and TRIT.StoreGroupID= 6 ) --
            inner join SaleArticles  as SA on (A.ArticleID = SA.ArticleID)
          left outer join Existed.ArticleTextileSizes as ATS on (A.ArticleID = ATS.ArticleID)
              where A.ParentArticleID =  36122   and A.ParentArticleID<>A.ArticleID
              order by ATS.ArticleClassificationID,A.code)::text
		-----------------
		, '"', '')::text[][])

Я никак не могу извлечь ParentArticleID вместе с масивом.
Есть какая-нибудь возможность сделать JOIN по A.ParentArticleID , если вышеприведенный запрос будет после FROM ?
...
Рейтинг: 0 / 0
12.11.2008, 15:39
    #35649505
tadmin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
join и вычисление массива через array(select... )
плохо сформулировал последнюю фразу.
я хотел бы сделать join этого запроса (возвращающего text[][]) с другими таблицами,
но никак не могу вытащить наружу parentArticleID для объединения.
...
Рейтинг: 0 / 0
12.11.2008, 20:08
    #35650309
tadmin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
join и вычисление массива через array(select... )
Решение нашлось. Concat & Array обсуждалось тут:
http://archives.postgresql.org/pgsql-sql/2007-12/msg00114.php
в этой же ветке ссылка на примеры.
http://www.zigo.dhs.org/postgresql/#comma_aggregate

Проблема, повторюсь, в том, что операция array (select ...) не может принять из запроса произвольное поле. Запрос должен всегда возвращать 1 столбец.

Агрегат же работает как функции max() min() etc только содержит в себе функцию обработчик (array_append), определение возвращаемого типа (anyarray) и исходное значение (пустой массив)

создали агрегат
Код: plaintext
1.
2.
3.
4.
5.
6.
CREATE AGGREGATE array_accum(anyelement)
(
    sfunc = array_append,
    stype = anyarray,
    initcond = '{}'
);

Теперь можем делать join таблицы товаров с готовыми массивами остатков (для каждого артикула возвращается прямогулосьная матрица).

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
select * from ParentArticles as PA
inner join (select TR.ParentArticleID,
	('{' || array_to_string(array_accum(		
               (string_to_array(
		TR.SaleArticleID::text			    || '|' ||
		coalesce(ATS.Name,TR.SaleArticleCode)::text         || '|' ||
		coalesce(TR.Amount, 0 )::text      	|| '|' ||
		coalesce(TR.AmountFree, 0 )::text  	|| '|' ||
		coalesce(TRIT.Amount, 0 )::text    	|| '|' ||
		coalesce(TRIT.AmountFree, 0 )::text
		, '|')::text)), ',') || '}')::text[][] as AmountArray
            from  TotalRestsNew as TR 
            inner join TotalRestsNew as TRIT on (TR.ArticleID = TRIT.ArticleID and TRIT.StoreGroupID= 6 ) 
          left outer join Existed.ArticleTextileSizes as ATS on (TR.ArticleID = ATS.ArticleID)
              where TR.ParentArticleID<>TR.ArticleID  and TR.StoreGroupID= 5 
              group by TR.ParentArticleID) as AArrays on (AArrays.ParentArticleID = PA.ParentArticleID)

Такой же результат можно получить, если для каждого PA.ParentArticleID вызывать функцию, которая строит массив, но если таких вызовов много, то это будет очень медленно.
И понятно почему. В запросе планировщик видит все таблицы и планирует запрос в целом.
При вызове функции он строит план для отдачи PA.ParentArticleID и N раз строит план для вызова функции, которая N раз лезет в большую таблицу.

На 6 товарах разница исполнения 1000мс для функций, 200мс для запроса.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / join и вычисление массива через array(select... ) / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]