#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)?