2013-08-22 5 views
0

У меня есть групповой запрос, который возвращает разные результаты, первый раз возвращает неверный результат, а затем возвращает правильный результат.Oracle 9.0.1.1 - Тот же запрос, возвращающий разные результаты

select 
c.customer_name, c.customer_address, invoice_no, 
sum(nvl(invoiced_amount,0)) invoice_amount, 
sum(nvl(received_amount,0)) received_amount, 
sum(nvl(returned_amount,0)) returned_amount 
from sales_detail d, sales s, customer c 
where d.inquiry_id = s.inquiry_id 
and s.customer_id = c.customer_id 
and s.sale_date between '01-jan-2012' and '31-dec-2012' 
group by c.customer_name, c.customer_address, invoice_no 

Он возвращает несколько строк и обеспечивают подсчет правильных строк, но удваивает стоимость некоторых счетов, как правило, это происходит, когда он работает в первый раз, а затем дает правильные результаты.
Ниже приведен пример:

Фактические данные в базе

invoice_no | invoiced_amount | received_amount | returned_amount 
000010020 | 500   |  230  |  0 

Результат возврата по запросу

invoice_no | invoiced_amount | received_amount | returned_amount 
000010020 | 1000   |  460  |  0 

Запрос начал вести себя, как это несколько дней назад, в противном случае работает в совершенстве.

Дополнительная информация

  • Есть 5 индексов на sales_detail таблице
  • Клиент представляет собой вид, физические таблицы в другой схеме с тем же именем информационного

Environment

  • ОС: Windows 2003 Server
  • База данных: Oracle 9.0.1.1 Предприятию
+0

Попробуйте удалить группу и измените выбор на 'select *'. Убедитесь, что вы не получаете несколько строк несколько раз. –

+0

Я проверил, указав конкретный invoice_no (этот результат счета удваивается), он возвращает правильные данные – user2705899

+0

Можете ли вы предоставить автономный тестовый файл с http://sqlfiddle.com –

ответ

2

Это не вопрос, который мы можем ответить. У вас есть простой запрос GROUP BY, и он будет суммировать эти атрибуты согласованным образом. Если вы получаете разные результаты, это связано с тем, что при выполнении запроса разные данные различаются.

Вы предоставляете образец «фактических данных», но пренебрегаете тем, из какой таблицы он исходит. Предположим, что это таблица sales_detail. Если в таблице есть записи, сумма которых равна X, но запрос возвращает агрегированное значение 2 X, вы должны иметь двойной счет. То есть, соединения в запросе заставляют вас получить два экземпляра каждой записи sales_detail.

Теперь вы также говорите, что это явление переходное. Если это так, то кажется вероятным, что что-то временно порождает вторую версию какой-либо записи. Возможно, у вас есть процесс EOD, который генерирует дополнительную запись customer по какой-то непостижимой причине, а затем очищает ее или закрывает старую?

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

Так что все, что мы можем сделать, это дать вам несколько указателей.

«Обычно это происходит, когда оно запускается впервые и позже дает правильные результаты ».

Как вы установили этот шаблон? «Обычно» - это то же самое, что «всегда»: вам понадобится дополнительная точность, чтобы помочь вам решить эту проблему. Какое исследование вы провели, чтобы выяснить, почему результаты меняются? Например, вы установили, какая другая деятельность происходит при запуске этого запроса? Вы указали необработанные данные перед запуском запроса?

«Запрос начался так, как это было несколько дней назад, в противном случае работал отлично».

Так что же изменилось несколько дней назад?


"Счета-фактуры были проверены индивидуально"

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


"это может быть ошибка"

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

Но даже если вы правы, и это ошибка, это знание вам не поможет. Вы используете базовую версию Oracle 9iR1, версию продукта, которая устарела уже более десятилетия. Таким образом, очевидно, что ваша организация не стремится к обновлению и, по-видимому, не платит за поддержку, поэтому исправление не является вариантом (даже если Oracle предоставит вам патчи для такого старого программного обеспечения, чего они не будут).

Итак, если это ошибка, вам нужно будет отследить ее самостоятельно и придумать обходной путь самостоятельно. Удачи с этим.

+0

Исходные или необработанные данные верны. Счета-фактуры проверяются индивидуально. Данные поступают из sales_detail – user2705899

+0

@ user2705899: Очень вероятно, что это неверно. Если бы вы сказали, что это было бы ошибкой в ​​Oracle. Хотя это возможно, кажется маловероятным. Вы присоединяетесь к трем таблицам. Если на одном из них более одной строки соответствует условию объединения, вы получите результат, который вы наблюдаете. –

+0

см. Следующий [ссылка] (http://oracle.ittoolbox.com/groups/technical-functional/oracle-db-l/has-anyone-seen-oracle-return-a-different-result-set-when- the-same-query-is-run-multiple-times-4083907), это может быть ошибка – user2705899

0

Похоже на то, что таблица клиентов или таблица продаж имеет дубликат или соединение не на ПК.

Смежные вопросы