Правильный синтаксис после использования LISTAGG - PullRequest
0 голосов
/ 10 июня 2019

Я работаю над запросом для Oracle, который использует LISTAGG. Я хотел бы включить оператор sub-select после использования LISTAGG, но продолжаю говорить о синтаксисе, и я думаю, что это связано со строкой "GROUP BY". Я не уверен в правильном синтаксисе для поля, встроенного в оператор sub-select в строке кода GROUP BY.

LISTAGG необходим, так как мне нужно, чтобы поле "PATCH_AREA" было сжато в одну строку вместо нескольких записей для каждого PATCH_AREA.

Следующий запрос работает нормально, если закомментированный раздел не включен. Мне нужно добавить закомментированную строку.

select
katpf7c as "Event ID",
artanrc as "Item Number",
artbezc as "Description",

prsvf18c as "Product Presentation",
prsvf19c as "Page Type",
doksnei as "Page Number",
LISTAGG(KAVBEZC,',') within GROUP (ORDER BY KAVBEZC) PATCH_AREA ,
provf10c as "Block Number",
prsvf17c as "Notes From Agency",
prsvf16c as "VBU Name"  --,

--(SELECT afl.aflfldc FROM fty inner join afl ON afl.aflftykeyi = fty.ftykeyi WHERE fty.ftybezc = 'MDVDesc' and AFL.AFLARTKEYI = ART.ARTKEYI and AFL.AFLKAVKEYI = ART.ARTKAVKEYI) as "MDVDesc",

from art
            inner join aez ON art.artkavkeyi = aez.aezkavkeyi and ART.ARTKEYI = AEZ.AEZARTKEYI
            inner join pro on pro.prokavkeyi = aez.aezkavkeyi and PRO.PROKEYI = AEZ.AEZPROKEYI
            full outer join DOK on PRO.PROKAVKEYI = DOK.DOKKAVKEYI and PRO.PROSNEI = DOK.DOKSNEI
            inner join prs on prsartkeyi = artkeyi and prskavkeyi = artkavkeyi
            join kav on kavkeyi = artkavkeyi
            join kat on kavkatkeyi = katkeyi
            full outer join psz on pszprokeyi = prokeyi and pszkavkeyi = prokavkeyi

where katkeyi in (5985)

group by katpf7c,artanrc,artbezc,prsvf18c,prsvf19c,doksnei,provf10c,prsvf17c,prsvf16c

order by artanrc

1 Ответ

1 голос
/ 10 июня 2019

Я не уверен, почему ваш вопрос о LISTAGG(). Кажется, это не имеет никакого отношения к проблеме.

Ваш подзапрос:

(SELECT afl.aflfldc
 FROM fty inner join
      afl
      ON afl.aflftykeyi = fty.ftykeyi
 WHERE fty.ftybezc = 'MDVDesc' and
       AFL.AFLARTKEYI = ART.ARTKEYI and
------------------------^ correlation columns
       AFL.AFLKAVKEYI = ART.ARTKAVKEYI
------------------------^
) as "MDVDesc",

Я выделил столбцы корреляции. В запросе агрегации они должны быть в GROUP BY, но это не так. Следовательно, Oracle запутался. Вы говорите, чтобы агрегировать по некоторым столбцам. Тогда вам нужна корреляция других.

Я думаю, что функция агрегации решит проблему:

(SELECT afl.aflfldc
 FROM fty inner join
      afl
      ON afl.aflftykeyi = fty.ftykeyi
 WHERE fty.ftybezc = 'MDVDesc' and
       AFL.AFLARTKEYI = MAX(ART.ARTKEYI0 and
------------------------^ correlation columns
       AFL.AFLKAVKEYI = MAX(ART.ARTKAVKEYI)
------------------------^
) as "MDVDesc",

Но, честно говоря, я обычно не вижу необходимости подобного подзапроса в агрегационном запросе; обычно есть другой способ написать логику.

...