Недопустимый идентификатор при использовании левого внешнего соединения в Oracle

#oracle #plsql

#Oracle #plsql

Вопрос:

Я написал запрос с внешним соединением слева в oracle.Но я выполняю запрос, я получаю ORA-00904: "b"."GROSS_DISCOUNT_AMOUNT": invalid identifier ошибку.TableB содержит столбцы net_discount_number и gross_discount_amount.

      select   
     a.GSMNO  GSMNO,
     a.NET_AMOUNT  net,
     a.GROSS_AMOUNT  gross,
     sum(b.net_discount_amount) net_discount, sum(b.gross_discount_amount) gross_discount,
     a.code code, a.seq_no
     from  tableA   a
LEFT OUTER JOIN 
    (select  id, code, seq_no, sum(gross_amount) gross_amount, sum(net_discount_amount), sum(gross_discount_amount) from tableB 
    group by id, code, seq_no)  
    b ON a.id = b.id and NVL(a.code,b.code) = NVL(b.code,-99) and  
    NVL(a._seq_no,-99)  = NVL(b.seq_no,-99)
    and a.gross_amount = b.gross_amount
 where  a.tvNo like  '123% and gsmno ='1111111111' 
 group by   
    a.GSMNO,
    a.NET_AMOUNT,
    a.GROSS_AMOUNT,
    a.code, a.seq_no
  

Комментарии:

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

2. Должно NVL(a._seq_no,-99) быть NVL(a.seq_no,-99) ? Должно like '123% and gsmno ='1111111111' быть like '123%' and gsmno ='1111111111' ?

3. На самом деле. Он работает, но TableB работает очень медленно, поэтому я добавил индекс TableB с 5 столбцами, но он все еще работает медленно. Я думаю, что group by вызывает эту проблему

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

5. Я не знаю плана выполнения. Я выполняю TableB с помощью select * from, он выполняется быстро, но если я добавляю group by, он выполняется медленно. TableB содержит 50 миллионов записей

Ответ №1:

Вы не указали псевдонимы для совокупных сумм, это должно быть так:

 select   
     a.GSMNO  GSMNO,
     a.NET_AMOUNT  net,
     a.GROSS_AMOUNT  gross,
     sum(b.net_discount_amount) net_discount, sum(b.gross_discount_amount) gross_discount,
     a.code code, a.seq_no
     from  tableA   a
LEFT OUTER JOIN 
    (select  id, code, seq_no, 
sum(gross_amount) gross_amount,
 sum(net_discount_amount) net_discount_amount,
 sum(gross_discount_amount) gross_discount_amount
from tableB 
    group by id, code, seq_no)  
    b ON a.id = b.id and NVL(a.code,b.code) = NVL(b.code,-99) and  
    NVL(a._seq_no,-99)  = NVL(b.seq_no,-99)
    and a.gross_amount = b.gross_amount
 where  a.tvNo like  '123% and gsmno ='1111111111' 
 group by   
    a.GSMNO,
    a.NET_AMOUNT,
    a.GROSS_AMOUNT,
    a.code, a.seq_no 
  

Комментарии:

1. Он работает, но медленно. Я думаю, что TableB работает медленно. Как я могу увеличить скорость выполнения.?

2. Должен ли я создать индекс со столбцами (id, code, seq_no, gross_amount,net_discount_amount,gross_discount_amount)?