Необходимо, чтобы rownum был одинаковым для каждой записи между двумя запросами, которые запрашивают одни и те же таблицы. - PullRequest
0 голосов
/ 22 февраля 2019

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

У меня есть два запроса, которые запрашивают обе таблицы через UNION ALL.Мне нужно одинаковое количество записей в каждом запросе, причем ROWNUM одинаково для каждой пользовательской записи между обоими наборами данных.

Я отменяю объединение между двумя запросами, заказываю их одинаково.Тем не менее, rownums разные, хотя данные должны быть получены в том же порядке.Любое понимание будет с благодарностью.

(я передаю эти данные в компонент графика \ диаграммы, в котором ROWNUM требуется для правильной работы)

Запрос 1

SELECT ROWNUM, cnt, opno FROM ( 
   SELECT SUM(fieldct) cnt, opno 
   FROM operchgeedp 
   WHERE opno <  997 
   AND LOWER(prognm) = 'eedpmain.exe' 
   AND TRUNC(begdtt) BETWEEN DATE'2019-02-01' 
   AND  TRUNC(SYSDATE) 
   GROUP BY opno 
   UNION ALL 
   SELECT 0 cnt, opno 
   FROM operchgprv 
   WHERE opno NOT IN (
      SELECT opno 
      FROM operchgeedp 
      WHERE opno <  997 
      AND LOWER(prognm) = 'eedpmain.exe' 
      AND TRUNC(begdtt) BETWEEN DATE'2019-02-01' 
      AND  TRUNC(SYSDATE) 
   )
   AND TRUNC(begdtt) BETWEEN DATE'2019-02-01' 
   AND  TRUNC(SYSDATE) 
   AND opno <  997 
   GROUP BY opno )
ORDER BY opno`

Запрос 2

SELECT ROWNUM, cnt, opno FROM ( 
   SELECT SUM(fieldct) cnt, opno 
   FROM operchgprv 
   WHERE opno <  997 
   AND LOWER(prognm) = 'prvmain.exe' 
   AND TRUNC(begdtt) BETWEEN DATE'2019-02-01' 
   AND  TRUNC(SYSDATE) 
   GROUP BY opno 
   UNION ALL 
   SELECT 0 cnt, opno 
   FROM operchgeedp 
   WHERE opno NOT IN (
      SELECT opno 
      FROM operchgprv 
      WHERE opno <  997 
      AND LOWER(prognm) = 'prvmain.exe' 
      AND TRUNC(begdtt) BETWEEN DATE'2019-02-01' 
      AND  TRUNC(SYSDATE) 
   ) 
   AND TRUNC(begdtt) BETWEEN DATE'2019-02-01' 
   AND  TRUNC(SYSDATE) 
   AND opno <  997 
   GROUP BY opno )
ORDER BY opno`

Query1

Query 2

1 Ответ

0 голосов
/ 22 февраля 2019

ROWNUM не обязательно соответствует, потому что это не сохраненное значение.Тем не менее, для ваших целей вы можете получить желаемый результат, переместив ORDER BY внутри блока ().

выберите rownum, cnt, opno from (... order by opno);

В качестве альтернативы вы можете попробовать использовать аналитическую функцию RANK: выберите rank () над (упорядочить по opno), cnt, opno from (...);

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