Запрос Oracle, возвращающий разные результаты для того же набора данных - PullRequest
1 голос
/ 12 августа 2011

У меня странная проблема, когда один и тот же запрос возвращает разные результаты.

Мой запрос:

SELECT * FROM TX_HISTORY  WHERE acct = 7  AND ROWNUM 

Происходит то, что я знаю, что для этой учетной записи в tx_history более 100 записей. Я хочу получить первые 100 записей на основе даты обработки. Мои данные для этого аккаунта у меня есть записи с 2004 по 2011 год

Проблема в том, что иногда он правильно показывает 100 записей, начиная с 2004 года, но иногда он показывает мне 100 записей, начиная с 2005 года

Я прочитал, что это можно решить с помощью:

SELECT * FROM (select * from TX_HISTORY  WHERE acct = 7  ORDER BY acct,processing_date)
where rownum 

так что в моем предыдущем запросе это что: 1> Насколько я понимаю, порядок применяется после rownum <= 100, а результаты, возвращаемые оракулом, находятся в случайном порядке, по которому фильтруется строка num </p>

Хотя что не понятно, почему результаты будут разными Спасибо, ~ Акила

Ответы [ 3 ]

8 голосов
/ 12 августа 2011

Если вы не укажете какой-либо порядок (и в этом случае, как вы уже узнали, вы не упорядочиваете извлекаемые данные, а только сортируете после этого), это зависит от базы данных, чтобы вернуть их в любом порядкесчитает нужным.

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

Поскольку вы не указали порядок, БД выберет (что она считает) наименее дорогой способ, доступный для него в данный конкретный момент.

0 голосов
/ 12 августа 2011

Если вы включите AND RowNum <= 100 Oracle извлечет 100 записей по собственному желанию.Если вы введете его в

SELECT *
  FROM TX_HISTORY
 WHERE acct = 7
   AND ROWNUM <= 100
 ORDER BY acct,processing_date

, оно будет выполнено для всех существующих записей.

Однако, если у вас есть

SELECT *
  FROM (select *
          from TX_HISTORY
         WHERE acct = 7
         ORDER BY acct,processing_date)
 where rownum <= 100

, оно будет выполнено для возвращенных записей.в суб-выборе (SELECT в ( ). Другими словами, Oracle использует другой набор записей для выполнения AND RowNum <= 100 в.

Упорядочение выполняется для записей, возвращаемых запросом, так бывает после WHERE -пункта. Так что вы, вероятно, по-прежнему будете получать разные результаты.

Надеюсь, я смогу прояснить ситуацию.

0 голосов
/ 12 августа 2011

Попробуйте это:

select top(100) from ...........

это даст 100 лучших строк, которые вы хотите.

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