ORA-01785: элемент ORDER BY должен быть номером выражения списка SELECT - PullRequest
0 голосов
/ 20 марта 2020

У меня есть простой запрос, который дает мне ошибку

Ошибка (2713,12): PL / SQL: ORA-00907: отсутствует правая скобка

SELECT XMLAgg(Case When (Select xx_info_n26 From xxsample_table Where xx_info_v1 = 'H' and xx_info_v27 = 'AR' ) > 0 Then 
      (SELECT XMLAGG(XMLCONCAT(XMLElement("tns:SprzedazWiersz",                                          
         xmlelement("tns:LpSprzedazy"      ,   rownum),
         xmlelement("tns:KodKrajuNadaniaTIN",  substr(ar_trx.tax_reg_num, 0, 2)),
         xmlelement("tns:NrKontrahenta"    ,   substr(ar_trx.tax_reg_num, 2)), 
         xmlelement("tns:NazwaKontrahenta" ,   ar_trx.cust_name),
         xmlelement("tns:DowodSprzedazy"   ,   ar_trx.trx_number),
         xmlelement("tns:DataWystawienia"  ,   TO_CHAR(ar_trx.invoice_date,'RRRR-MM-DD')),      
         Case When ar_trx.sales_date is not null Then xmlelement("tns:DataSprzedazy"    ,   TO_CHAR(ar_trx.sales_date,'RRRR-MM-DD')) END,
         -- DocumentType
         (Select  xmlelement("tns:TypDokumentu" , doctype.Document_type_code)
            from    (select distinct xx_info_n3 trx_id
                        ,   xx_info_v15         Document_type_code
                     From   xxsample_table
                     Where  xx_info_v1 = 'AR'
                     and    xx_info_v16 = 'ORA_JEPL_DOCUMENT_TYPE') doctype
            where    doctype.trx_id  = ar_trx.trx_id),  
        -- Transaction Attributes
        (Select xmlagg(xmlconcat(xmlelement(evalname(trdattr.TRANSACTION_ATTRIBUTE_CODE), 1)))
         From    ( Select distinct xx_info_v12 TRANSACTION_ATTRIBUTE_CODE
                   From   xxsample_table
                   Where  xx_info_V1 = 'AR'
                   and    xx_info_v12 <> 'tns:'
                   and    xx_info_n3 = ar_trx.trx_id 
                   UNION ALL
                   Select xx_info_v20 TRANSACTION_ATTRIBUTE_CODE
                   From   xxsample_table 
                   Where  xx_info_V1 = 'AR'
                   and    xx_info_n3 = ar_trx.trx_id 
                   and    xx_info_v20 <> 0) trdattr
        order by 
        case TRANSACTION_ATTRIBUTE_CODE 
        when 'tns:SW'       then 1
        when 'tns:EE'       THEN 2
        when 'tns:TP'       THEN 3
        when 'tns:TT_WNT'   then 4
        when 'tns:TT_D'     THEN 5
        when 'tns:MR_T'     THEN 6
        when 'tns:MR_UZ'    THEN 7
        when 'tns:I_42'     THEN 8
        when 'tns:I_63'     THEN 9
        when 'tns:B_SPV'    THEN 10
        when 'tns:B_SPV_DOSTAWA' THEN 11
        when 'tns:B_MPV_PROWIZJA' THEN 12
        when 'tns:MPP' THEN 13
        ELSE 14 END)   
        ,
        -- Kboxes
       (Select xmlagg(xmlconcat(xmlelement(evalname(ar_tax_sum.box),ar_tax_sum.amount)))
      From ( select box
                ,   sum(amount) amount
            from    (Select xx_info_v5      box
                        ,   Sum(xx_info_n1) amount
                    From    xxsample_table 
                    Where   xx_info_V1 = 'AR'
                    and     xx_info_n3 = ar_trx.trx_id
                    Group By xx_info_v5
                    UNION
                    Select  xx_info_v6      box
                         ,  Sum(xx_info_n2) amount        
                    From    xxsample_table 
                    Where   xx_info_V1 = 'AR'
                    and     xx_info_n3 = ar_trx.trx_id
                    Group By xx_info_v6)
            Where box <> 'tns:'
            group by box) ar_tax_sum
      )                                     
        ))
       )
         From ( Select distinct xx_info_n3 trx_id
                              , xx_info_v2 trx_number
                              , xx_info_d1 sales_date
                              , xx_info_d3 invoice_date
                              , xx_info_v3 cust_name
                              , xx_info_v17 cust_addr
                              , xx_info_v7  tax_reg_num
                 From xxsample_table
                 Where xx_info_v1 = 'AR'
                 Order by 3,4
              ) ar_trx
         ) End)
FROM DUAL)

Я думаю, что эта ошибка вызвана условным ORDER BY, потому что, когда я полностью удаляю ORDER BY (строки 31-46), запрос работает нормально. Тем не менее, я не понимаю, почему это может вызвать ошибку, когда я могу выполнить отдельный подзапрос самостоятельно:

Select xmlagg(xmlconcat(xmlelement(evalname(trdattr.TRANSACTION_ATTRIBUTE_CODE), 1)))
From    ( Select distinct xx_info_v12 TRANSACTION_ATTRIBUTE_CODE
           From   xxsample_table
           Where  xx_info_V1 = 'AR'
           and    xx_info_v12 <> 'tns:'
           --and      xx_info_n3 = ar_trx.trx_id 
           UNION ALL
           Select xx_info_v20 TRANSACTION_ATTRIBUTE_CODE
           From   xxsample_table 
           Where  xx_info_V1 = 'AR'
           --and      xx_info_n3 = ar_trx.trx_id 
           and    xx_info_v20 <> 0) trdattr
order by 
case TRANSACTION_ATTRIBUTE_CODE 
when 'tns:SW'       then 1
when 'tns:EE'       THEN 2
when 'tns:TP'       THEN 3
when 'tns:TT_WNT'   then 4
when 'tns:TT_D'     THEN 5
when 'tns:MR_T'     THEN 6
when 'tns:MR_UZ'    THEN 7
when 'tns:I_42'     THEN 8
when 'tns:I_63'     THEN 9
when 'tns:B_SPV'    THEN 10
when 'tns:B_SPV_DOSTAWA' THEN 11
when 'tns:B_MPV_PROWIZJA' THEN 12
when 'tns:MPP' THEN 13
ELSE 14 END

Я также попробовал просто обычный ORDER BY, и он все еще дает мне ошибка.

Я попытался переместить ORDER BY в самый внутренний запрос trdattr, и он как-то работает. Однако при повторном добавлении оператора CASE появляется следующая ошибка:

ORA-01785: элемент ORDER BY должен быть номером выражения списка SELECT

Как правильно включить условное ORDER BY в основной запрос?

Ответы [ 2 ]

2 голосов
/ 20 марта 2020

Исходя из вашего предыдущего вопроса, я думаю, что вы, вероятно, пытаетесь упорядочить элементы в XMLAGG(), поэтому вы захотите поместить свой оператор order by в вызов xmlagg :

-- excerpt from your main query...
-- Transaction Attributes
(Select xmlagg(xmlconcat(xmlelement(evalname(trdattr.TRANSACTION_ATTRIBUTE_CODE), 1))
               order by 
               case TRANSACTION_ATTRIBUTE_CODE 
               when 'tns:SW'       then 1
               when 'tns:EE'       THEN 2
               when 'tns:TP'       THEN 3
               when 'tns:TT_WNT'   then 4
               when 'tns:TT_D'     THEN 5
               when 'tns:MR_T'     THEN 6
               when 'tns:MR_UZ'    THEN 7
               when 'tns:I_42'     THEN 8
               when 'tns:I_63'     THEN 9
               when 'tns:B_SPV'    THEN 10
               when 'tns:B_SPV_DOSTAWA' THEN 11
               when 'tns:B_MPV_PROWIZJA' THEN 12
               when 'tns:MPP' THEN 13
               ELSE 14 END)
 From    ( Select distinct xx_info_v12 TRANSACTION_ATTRIBUTE_CODE
           From   xxsample_table
           Where  xx_info_V1 = 'AR'
           and    xx_info_v12 <> 'tns:'
           and    xx_info_n3 = ar_trx.trx_id 
           UNION ALL
           Select xx_info_v20 TRANSACTION_ATTRIBUTE_CODE
           From   xxsample_table 
           Where  xx_info_V1 = 'AR'
           and    xx_info_n3 = ar_trx.trx_id 
           and    xx_info_v20 <> 0) trdattr),
-- Kboxes
-- continue main query

Я не могу проверить это, но, возможно, попробую.

1 голос
/ 20 марта 2020

Ваш автономный запрос работает, но в основном запросе вы используете его как скалярное выражение подзапроса . Следовательно, упрощенная версия вашего основного запроса будет выглядеть следующим образом:

select (
-- start of your standlone query
Select xmlagg(xmlconcat(xmlelement(evalname(trdattr.TRANSACTION_ATTRIBUTE_CODE), 1)))
From    ( Select distinct xx_info_v12 TRANSACTION_ATTRIBUTE_CODE
           From   xxsample_table
           Where  xx_info_V1 = 'AR'
           and    xx_info_v12 <> 'tns:'
           --and      xx_info_n3 = ar_trx.trx_id 
           UNION ALL
           Select xx_info_v20 TRANSACTION_ATTRIBUTE_CODE
           From   xxsample_table 
           Where  xx_info_V1 = 'AR'
           --and      xx_info_n3 = ar_trx.trx_id 
           and    xx_info_v20 <> 0) trdattr
order by 
case TRANSACTION_ATTRIBUTE_CODE 
when 'tns:SW'       then 1
when 'tns:EE'       THEN 2
when 'tns:TP'       THEN 3
when 'tns:TT_WNT'   then 4
when 'tns:TT_D'     THEN 5
when 'tns:MR_T'     THEN 6
when 'tns:MR_UZ'    THEN 7
when 'tns:I_42'     THEN 8
when 'tns:I_63'     THEN 9
when 'tns:B_SPV'    THEN 10
when 'tns:B_SPV_DOSTAWA' THEN 11
when 'tns:B_MPV_PROWIZJA' THEN 12
when 'tns:MPP' THEN 13
ELSE 14 END
-- end of your standalone query
)
from dual

..., которая также выдает «ORA-00907: отсутствует правая скобка».

Как сказано в документации:

Скалярное выражение подзапроса - это подзапрос, который возвращает ровно одно значение столбца из одной строки.

это то, что у вас здесь есть - одна строка с одним столбцом, который является вашим результатом XMLAgg. Немного бессмысленно и бессмысленно пытаться упорядочить этот единственный ряд. Oracle не ожидает увидеть предложение order-by в этот момент, он ожидает увидеть закрывающую скобку для выражения подзапроса - отсюда и ошибку, которую он выдает.

При перемещении заказа в встроенное представление, где это может иметь больше смысла:

Select xmlagg(xmlconcat(xmlelement(evalname(trdattr.TRANSACTION_ATTRIBUTE_CODE), 1)))
From    ( Select distinct xx_info_v12 TRANSACTION_ATTRIBUTE_CODE
           From   xxsample_table
           Where  xx_info_V1 = 'AR'
           and    xx_info_v12 <> 'tns:'
           --and      xx_info_n3 = ar_trx.trx_id 
           UNION ALL
           Select xx_info_v20 TRANSACTION_ATTRIBUTE_CODE
           From   xxsample_table 
           Where  xx_info_V1 = 'AR'
           --and      xx_info_n3 = ar_trx.trx_id 
           and    xx_info_v20 <> 0
           order by 
           case TRANSACTION_ATTRIBUTE_CODE 
           when 'tns:SW'       then 1
           when 'tns:EE'       THEN 2
           when 'tns:TP'       THEN 3
           when 'tns:TT_WNT'   then 4
           when 'tns:TT_D'     THEN 5
           when 'tns:MR_T'     THEN 6
           when 'tns:MR_UZ'    THEN 7
           when 'tns:I_42'     THEN 8
           when 'tns:I_63'     THEN 9
           when 'tns:B_SPV'    THEN 10
           when 'tns:B_SPV_DOSTAWA' THEN 11
           when 'tns:B_MPV_PROWIZJA' THEN 12
           when 'tns:MPP' THEN 13
           ELSE 14 END
        ) trdattr

вы получаете «ORA-01785: элемент ORDER BY должен быть номером выражения SELECT-list», что, вероятно, эта ошибка . Обходной путь здесь также работает, добавляя еще один уровень подзапроса:

Select xmlagg(xmlconcat(xmlelement(evalname(trdattr.TRANSACTION_ATTRIBUTE_CODE), 1)))
From (
  Select *
  From    ( Select distinct xx_info_v12 TRANSACTION_ATTRIBUTE_CODE
             From   xxsample_table
             Where  xx_info_V1 = 'AR'
             and    xx_info_v12 <> 'tns:'
             --and      xx_info_n3 = ar_trx.trx_id 
             UNION ALL
             Select xx_info_v20 TRANSACTION_ATTRIBUTE_CODE
             From   xxsample_table 
             Where  xx_info_V1 = 'AR'
             --and      xx_info_n3 = ar_trx.trx_id 
             and    xx_info_v20 <> 0
          )
         order by 
         case TRANSACTION_ATTRIBUTE_CODE 
         when 'tns:SW'       then 1
         when 'tns:EE'       THEN 2
         when 'tns:TP'       THEN 3
         when 'tns:TT_WNT'   then 4
         when 'tns:TT_D'     THEN 5
         when 'tns:MR_T'     THEN 6
         when 'tns:MR_UZ'    THEN 7
         when 'tns:I_42'     THEN 8
         when 'tns:I_63'     THEN 9
         when 'tns:B_SPV'    THEN 10
         when 'tns:B_SPV_DOSTAWA' THEN 11
         when 'tns:B_MPV_PROWIZJA' THEN 12
         when 'tns:MPP' THEN 13
         ELSE 14 END
  ) trdattr

Затем вы можете сделать , что , скалярным выражением подзапроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...